1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*
2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * noVNC: HTML5 VNC client
3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (C) 2011 Joel Martin
4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Licensed under LGPL-3 (see LICENSE.txt)
5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *
6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * See README.md for usage and integration instructions.
7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat"use strict";
10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*jslint white: false, browser: true */
11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/*global window, $D, Util, WebUtil, RFB, Display */
12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvar UI = {
14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatrfb_state : 'loaded',
16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsettingsOpen : false,
17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatconnSettingsOpen : false,
18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatclipboardOpen: false,
19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatkeyboardVisible: false,
20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Render default UI and initialize settings menu
22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatload: function() {
23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var html = '', i, sheet, sheets, llevels;
24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Stylesheet selection dropdown
26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    sheet = WebUtil.selectStylesheet();
27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    sheets = WebUtil.getStylesheets();
28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (i = 0; i < sheets.length; i += 1) {
29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.addOption($D('noVNC_stylesheet'),sheets[i].title, sheets[i].title);
30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Logging selection dropdown
33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    llevels = ['error', 'warn', 'info', 'debug'];
34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (i = 0; i < llevels.length; i += 1) {
35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.addOption($D('noVNC_logging'),llevels[i], llevels[i]);
36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Settings with immediate effects
39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('logging', 'warn');
40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.init_logging(UI.getSetting('logging'));
41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('stylesheet', 'default');
43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.selectStylesheet(null);
44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // call twice to get around webkit bug
45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    /* Populate the controls if defaults are provided in the URL */
48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('host', window.location.hostname);
49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('port', window.location.port);
50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('password', '');
51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('encrypt', (window.location.protocol === "https:"));
52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('true_color', true);
53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('cursor', false);
54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('shared', true);
55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('view_only', false);
56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('connectTimeout', 2);
57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.initSetting('path', 'websockify');
58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb = RFB({'target': $D('noVNC_canvas'),
60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                  'onUpdateState': UI.updateState,
61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                  'onClipboard': UI.clipReceive});
62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.updateVisualState();
63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Unfocus clipboard when over the VNC area
65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //$D('VNC_screen').onmousemove = function () {
66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //         var keyboard = UI.rfb.get_keyboard();
67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //        if ((! keyboard) || (! keyboard.get_focused())) {
68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //            $D('VNC_clipboard_text').blur();
69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //         }
70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //    };
71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Show mouse selector buttons on touch screen devices
73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if ('ontouchstart' in document.documentElement) {
74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Show mobile buttons
75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_mobile_buttons').style.display = "inline";
76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setMouseButton();
77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Remove the address bar
78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        setTimeout(function() { window.scrollTo(0, 1); }, 100);
79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.forceSetting('clip', true);
80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_clip').disabled = true;
81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.initSetting('clip', false);
83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //iOS Safari does not support CSS position:fixed.
86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //This detects iOS devices and enables javascript workaround.
87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if ((navigator.userAgent.match(/iPhone/i)) ||
88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        (navigator.userAgent.match(/iPod/i)) ||
89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        (navigator.userAgent.match(/iPad/i))) {
90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        //UI.setOnscroll();
91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        //UI.setResize();
92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_host').focus();
95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.setViewClip();
97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.addEvent(window, 'resize', UI.setViewClip);
98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.addEvent(window, 'beforeunload', function () {
100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (UI.rfb_state === 'normal') {
101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            return "You are currently connected.";
102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } );
104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Show description by default when hosted at for kanaka.github.com
106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (location.host === "kanaka.github.com") {
107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Open the description dialog
108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_description').style.display = "block";
109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Open the connect panel on first load
111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.toggleConnectPanel();
112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Read form control compatible setting from cookie
116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatgetSetting: function(name) {
117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var val, ctrl = $D('noVNC_' + name);
118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    val = WebUtil.readCookie(name);
119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (ctrl.type === 'checkbox') {
120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (val.toLowerCase() in {'0':1, 'no':1, 'false':1}) {
121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            val = false;
122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else {
123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            val = true;
124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return val;
127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Update cookie and form control setting. If value is not set, then
130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// updates from control to current cookie setting.
131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatupdateSetting: function(name, value) {
132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var i, ctrl = $D('noVNC_' + name);
134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Save the cookie for this session
135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof value !== 'undefined') {
136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        WebUtil.createCookie(name, value);
137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Update the settings control
140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    value = UI.getSetting(name);
141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (ctrl.type === 'checkbox') {
143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        ctrl.checked = value;
144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else if (typeof ctrl.options !== 'undefined') {
146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        for (i = 0; i < ctrl.options.length; i += 1) {
147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            if (ctrl.options[i].value === value) {
148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                ctrl.selectedIndex = i;
149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                break;
150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            }
151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        /*Weird IE9 error leads to 'null' appearring
154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        in textboxes instead of ''.*/
155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (value === null) {
156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            value = "";
157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        ctrl.value = value;
159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Save control setting to cookie
163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsaveSetting: function(name) {
164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var val, ctrl = $D('noVNC_' + name);
165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (ctrl.type === 'checkbox') {
166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        val = ctrl.checked;
167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else if (typeof ctrl.options !== 'undefined') {
168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        val = ctrl.options[ctrl.selectedIndex].value;
169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        val = ctrl.value;
171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.createCookie(name, val);
173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Util.Debug("Setting saved '" + name + "=" + val + "'");
174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return val;
175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Initial page load read/initialization of settings
178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatinitSetting: function(name, defVal) {
179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var val;
180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Check Query string followed by cookie
182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    val = WebUtil.getQueryVar(name);
183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (val === null) {
184a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        val = WebUtil.readCookie(name, defVal);
185a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
186a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.updateSetting(name, val);
187a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat //Util.Debug("Setting '" + name + "' initialized to '" + val + "'");
188a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return val;
189a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
190a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
191a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Force a setting to be a certain value
192a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatforceSetting: function(name, val) {
193a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.updateSetting(name, val);
194a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return val;
195a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
196a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
197a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
198a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Show the clipboard panel
199a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehattoggleClipboardPanel: function() {
200a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Close the description panel
201a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_description').style.display = "none";
202a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Close settings if open
203a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.settingsOpen === true) {
204a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.settingsApply();
205a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.closeSettingsMenu();
206a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
207a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Close connection settings if open
208a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.connSettingsOpen === true) {
209a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.toggleConnectPanel();
210a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
211a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Toggle Clipboard Panel
212a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.clipboardOpen === true) {
213a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_clipboard').style.display = "none";
214a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('clipboardButton').className = "noVNC_status_button";
215a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.clipboardOpen = false;
216a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
217a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_clipboard').style.display = "block";
218a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('clipboardButton').className = "noVNC_status_button_selected";
219a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.clipboardOpen = true;
220a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
221a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
222a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
223a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Show the connection settings panel/menu
224a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehattoggleConnectPanel: function() {
225a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Close the description panel
226a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_description').style.display = "none";
227a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Close connection settings if open
228a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.settingsOpen === true) {
229a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.settingsApply();
230a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.closeSettingsMenu();
231a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('connectButton').className = "noVNC_status_button";
232a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
233a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.clipboardOpen === true) {
234a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.toggleClipboardPanel();
235a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
236a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
237a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Toggle Connection Panel
238a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.connSettingsOpen === true) {
239a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_controls').style.display = "none";
240a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('connectButton').className = "noVNC_status_button";
241a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.connSettingsOpen = false;
242a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
243a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_controls').style.display = "block";
244a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('connectButton').className = "noVNC_status_button_selected";
245a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.connSettingsOpen = true;
246a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_host').focus();
247a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
248a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
249a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
250a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Toggle the settings menu:
251a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat//   On open, settings are refreshed from saved cookies.
252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat//   On close, settings are applied
253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehattoggleSettingsPanel: function() {
254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Close the description panel
255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_description').style.display = "none";
256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.settingsOpen) {
257a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.settingsApply();
258a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.closeSettingsMenu();
259a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
260a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('encrypt');
261a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('true_color');
262a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (UI.rfb.get_display().get_cursor_uri()) {
263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            UI.updateSetting('cursor');
264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else {
265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            UI.updateSetting('cursor', false);
266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('noVNC_cursor').disabled = true;
267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('clip');
269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('shared');
270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('view_only');
271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('connectTimeout');
272a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('path');
273a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('stylesheet');
274a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('logging');
275a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
276a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.openSettingsMenu();
277a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
278a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
279a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
280a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Open menu
281a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatopenSettingsMenu: function() {
282a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Close the description panel
283a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_description').style.display = "none";
284a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.clipboardOpen === true) {
285a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.toggleClipboardPanel();
286a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
287a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Close connection settings if open
288a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.connSettingsOpen === true) {
289a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.toggleConnectPanel();
290a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
291a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_settings').style.display = "block";
292a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('settingsButton').className = "noVNC_status_button_selected";
293a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.settingsOpen = true;
294a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
295a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
296a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Close menu (without applying settings)
297a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatcloseSettingsMenu: function() {
298a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_settings').style.display = "none";
299a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('settingsButton').className = "noVNC_status_button";
300a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.settingsOpen = false;
301a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
302a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
303a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Save/apply settings when 'Apply' button is pressed
304a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsettingsApply: function() {
305a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Util.Debug(">> settingsApply");
306a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('encrypt');
307a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('true_color');
308a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.rfb.get_display().get_cursor_uri()) {
309a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.saveSetting('cursor');
310a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
311a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('clip');
312a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('shared');
313a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('view_only');
314a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('connectTimeout');
315a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('path');
316a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('stylesheet');
317a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.saveSetting('logging');
318a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
319a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // Settings with immediate (non-connected related) effect
320a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
321a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    WebUtil.init_logging(UI.getSetting('logging'));
322a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.setViewClip();
323a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.setViewDrag(UI.rfb.get_viewportDrag());
324a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Util.Debug("<< settingsApply");
325a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
326a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
327a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
328a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
329a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetPassword: function() {
330a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.sendPassword($D('noVNC_password').value);
331a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Reset connect button.
332a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_connect_button').value = "Connect";
333a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_connect_button').onclick = UI.Connect;
334a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Hide connection panel.
335a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.toggleConnectPanel();
336a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    return false;
337a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
338a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
339a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsendCtrlAltDel: function() {
340a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.sendCtrlAltDel();
341a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
342a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
343a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetMouseButton: function(num) {
344a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var b, blist = [0, 1,2,4], button;
345a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
346a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof num === 'undefined') {
347a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Disable mouse buttons
348a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        num = -1;
349a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
350a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.rfb) {
351a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.rfb.get_mouse().set_touchButton(num);
352a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
353a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
354a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for (b = 0; b < blist.length; b++) {
355a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        button = $D('noVNC_mouse_button' + blist[b]);
356a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (blist[b] === num) {
357a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.display = "";
358a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        } else {
359a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.display = "none";
360a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            /*
361a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.backgroundColor = "black";
362a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.color = "lightgray";
363a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.backgroundColor = "";
364a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            button.style.color = "";
365a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            */
366a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
367a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
368a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
369a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
370a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatupdateState: function(rfb, state, oldstate, msg) {
371a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var s, sb, c, d, cad, vd, klass;
372a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb_state = state;
373a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    s = $D('noVNC_status');
374a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    sb = $D('noVNC_status_bar');
375a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    switch (state) {
376a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'failed':
377a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'fatal':
378a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            klass = "noVNC_status_error";
379a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
380a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'normal':
381a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            klass = "noVNC_status_normal";
382a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
383a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'disconnected':
384a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('noVNC_logo').style.display = "block";
385a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            // Fall through
386a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'loaded':
387a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            klass = "noVNC_status_normal";
388a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
389a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'password':
390a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            UI.toggleConnectPanel();
391a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
392a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('noVNC_connect_button').value = "Send Password";
393a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('noVNC_connect_button').onclick = UI.setPassword;
394a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('noVNC_password').focus();
395a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
396a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            klass = "noVNC_status_warn";
397a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
398a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        default:
399a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            klass = "noVNC_status_warn";
400a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
401a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
402a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
403a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof(msg) !== 'undefined') {
404a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        s.setAttribute("class", klass);
405a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        sb.setAttribute("class", klass);
406a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        s.innerHTML = msg;
407a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
408a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
409a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.updateVisualState();
410a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
411a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
412a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Disable/enable controls depending on connection state
413a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatupdateVisualState: function() {
414a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var connected = UI.rfb_state === 'normal' ? true : false;
415a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
416a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Util.Debug(">> updateVisualState");
417a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_encrypt').disabled = connected;
418a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_true_color').disabled = connected;
419a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.rfb && UI.rfb.get_display() &&
420a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.rfb.get_display().get_cursor_uri()) {
421a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_cursor').disabled = connected;
422a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
423a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('cursor', false);
424a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_cursor').disabled = true;
425a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
426a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_shared').disabled = connected;
427a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_view_only').disabled = connected;
428a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_connectTimeout').disabled = connected;
429a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_path').disabled = connected;
430a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
431a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (connected) {
432a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setViewClip();
433a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setMouseButton(1);
434a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('clipboardButton').style.display = "inline";
435a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('showKeyboard').style.display = "inline";
436a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('sendCtrlAltDelButton').style.display = "inline";
437a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
438a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setMouseButton();
439a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('clipboardButton').style.display = "none";
440a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('showKeyboard').style.display = "none";
441a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('sendCtrlAltDelButton').style.display = "none";
442a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
443a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // State change disables viewport dragging.
444a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    // It is enabled (toggled) by direct click on the button
445a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.setViewDrag(false);
446a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
447a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    switch (UI.rfb_state) {
448a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'fatal':
449a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'failed':
450a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'loaded':
451a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case 'disconnected':
452a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('connectButton').style.display = "";
453a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('disconnectButton').style.display = "none";
454a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
455a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        default:
456a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('connectButton').style.display = "none";
457a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            $D('disconnectButton').style.display = "";
458a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat            break;
459a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
460a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
461a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Util.Debug("<< updateVisualState");
462a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
463a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
464a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
465a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatclipReceive: function(rfb, text) {
466a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.Debug(">> UI.clipReceive: " + text.substr(0,40) + "...");
467a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_clipboard_text').value = text;
468a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.Debug("<< UI.clipReceive");
469a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
470a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
471a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
472a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatconnect: function() {
473a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var host, port, password, path;
474a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
475a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.closeSettingsMenu();
476a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.toggleConnectPanel();
477a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
478a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    host = $D('noVNC_host').value;
479a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    port = $D('noVNC_port').value;
480a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    password = $D('noVNC_password').value;
481a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    path = $D('noVNC_path').value;
482a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if ((!host) || (!port)) {
483a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        throw("Must set host and port");
484a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
485a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
486a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_encrypt(UI.getSetting('encrypt'));
487a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_true_color(UI.getSetting('true_color'));
488a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_local_cursor(UI.getSetting('cursor'));
489a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_shared(UI.getSetting('shared'));
490a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_view_only(UI.getSetting('view_only'));
491a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.set_connectTimeout(UI.getSetting('connectTimeout'));
492a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
493a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.connect(host, port, password, path);
494a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Close dialog.
495a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    setTimeout(UI.setBarPosition, 100);
496a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_logo').style.display = "none";
497a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
498a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
499a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdisconnect: function() {
500a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.closeSettingsMenu();
501a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.disconnect();
502a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
503a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_logo').style.display = "block";
504a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.connSettingsOpen = false;
505a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.toggleConnectPanel();
506a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
507a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
508a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatdisplayBlur: function() {
509a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.get_keyboard().set_focused(false);
510a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.get_mouse().set_focused(false);
511a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
512a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
513a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatdisplayFocus: function() {
514a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.get_keyboard().set_focused(true);
515a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.get_mouse().set_focused(true);
516a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
517a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
518a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatclipClear: function() {
519a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_clipboard_text').value = "";
520a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.clipboardPasteFrom("");
521a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
522a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
523a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatclipSend: function() {
524a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var text = $D('noVNC_clipboard_text').value;
525a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.Debug(">> UI.clipSend: " + text.substr(0,40) + "...");
526a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.rfb.clipboardPasteFrom(text);
527a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    Util.Debug("<< UI.clipSend");
528a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
529a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
530a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
531a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Enable/disable and configure viewport clipping
532a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetViewClip: function(clip) {
533a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var display, cur_clip, pos, new_w, new_h;
534a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
535a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.rfb) {
536a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        display = UI.rfb.get_display();
537a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
538a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        return;
539a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
540a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
541a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    cur_clip = display.get_viewport();
542a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
543a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof(clip) !== 'boolean') {
544a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Use current setting
545a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        clip = UI.getSetting('clip');
546a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
547a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
548a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (clip && !cur_clip) {
549a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Turn clipping on
550a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('clip', true);
551a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else if (!clip && cur_clip) {
552a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // Turn clipping off
553a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.updateSetting('clip', false);
554a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        display.set_viewport(false);
555a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_canvas').style.position = 'static';
556a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        display.viewportChange();
557a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
558a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.getSetting('clip')) {
559a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // If clipping, update clipping settings
560a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('noVNC_canvas').style.position = 'absolute';
561a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        pos = Util.getPosition($D('noVNC_canvas'));
562a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        new_w = window.innerWidth - pos.x;
563a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        new_h = window.innerHeight - pos.y;
564a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        display.set_viewport(true);
565a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        display.viewportChange(0, 0, new_w, new_h);
566a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
567a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
568a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
569a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// Toggle/set/unset the viewport drag/move button
570a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetViewDrag: function(drag) {
571a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var vmb = $D('noVNC_view_drag_button');
572a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (!UI.rfb) { return; }
573a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
574a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (UI.rfb_state === 'normal' &&
575a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.rfb.get_display().get_viewport()) {
576a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        vmb.style.display = "inline";
577a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
578a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        vmb.style.display = "none";
579a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
580a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
581a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (typeof(drag) === "undefined") {
582a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        // If not specified, then toggle
583a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        drag = !UI.rfb.get_viewportDrag();
584a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
585a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if (drag) {
586a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        vmb.className = "noVNC_status_button_selected";
587a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.rfb.set_viewportDrag(true);
588a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else {
589a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        vmb.className = "noVNC_status_button";
590a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.rfb.set_viewportDrag(false);
591a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
592a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
593a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
594a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// On touch devices, show the OS keyboard
595a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatshowKeyboard: function() {
596a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    if(UI.keyboardVisible === false) {
597a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('keyboardinput').focus();
598a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.keyboardVisible = true;
599a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('showKeyboard').className = "noVNC_status_button_selected";
600a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    } else if(UI.keyboardVisible === true) {
601a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('keyboardinput').blur();
602a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        $D('showKeyboard').className = "noVNC_status_button";
603a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.keyboardVisible = false;
604a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
605a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
606a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
607a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatkeyInputBlur: function() {
608a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('showKeyboard').className = "noVNC_status_button";
609a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //Weird bug in iOS if you change keyboardVisible
610a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //here it does not actually occur so next time
611a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    //you click keyboard icon it doesnt work.
612a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    setTimeout(function() { UI.setKeyboard(); },100);
613a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
614a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
615a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetKeyboard: function() {
616a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    UI.keyboardVisible = false;
617a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
618a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
619a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat// iOS < Version 5 does not support position fixed. Javascript workaround:
620a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetOnscroll: function() {
621a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    window.onscroll = function() {
622a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setBarPosition();
623a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    };
624a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
625a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
626a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetResize: function () {
627a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    window.onResize = function() {
628a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        UI.setBarPosition();
629a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    };
630a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
631a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
632a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat//Helper to add options to dropdown.
633a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehataddOption: function(selectbox,text,value )
634a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
635a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var optn = document.createElement("OPTION");
636a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    optn.text = text;
637a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    optn.value = value;
638a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    selectbox.options.add(optn);
639a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat},
640a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
641a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatsetBarPosition: function() {
642a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC-control-bar').style.top = (window.pageYOffset) + 'px';
643a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC_mobile_buttons').style.left = (window.pageXOffset) + 'px';
644a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
645a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    var vncwidth = $D('noVNC_screen').style.offsetWidth;
646a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    $D('noVNC-control-bar').style.width = vncwidth + 'px';
647a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
648a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
649a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat};
650a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
651a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
652a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
653a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
654