~azzar1/unity/add-show-desktop-key

332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
1
/* IVLE - Informatics Virtual Learning Environment
2
 * Copyright (C) 2007-2008 The University of Melbourne
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 2 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software
16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
 *
18
 * Module: Console (Client-side JavaScript)
19
 * Author: Tom Conway, Matt Giuca
20
 * Date: 30/1/2008
21
 */
22
432 by drtomc
usrmgt: more work on this. Still some work to go.
23
var server_key;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
24
339 by mattgiuca
console:
25
/* Begin religious debate (tabs vs spaces) here: */
26
/* (This string will be inserted in the console when the user presses the Tab
27
 * key) */
28
TAB_STRING = "    ";
29
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
30
/* Console DOM objects */
31
console_body = null;
32
console_filler = null;
33
339 by mattgiuca
console:
34
windowpane_mode = false;
343 by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect
35
server_started = false;
339 by mattgiuca
console:
36
628 by drtomc
console: Add output based interrupt. This allows users to interrupt long
37
interrupted = false;
38
1340 by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333).
39
40
function get_console_start_directory()
41
{
42
    if((typeof(current_path) != 'undefined') && current_file)
43
    {
44
        // We have a current_path - give a suggestion to the server
45
        var path;
46
        if (current_file.isdir)
47
        {
48
            // Browser
49
            return path_join("/home", current_path);
50
        }
51
        else
52
        {
53
            // Editor - need to chop off filename
54
            var tmp_path = current_path.split('/');
55
            tmp_path.pop();
56
            return path_join("/home", tmp_path.join('/'));
57
        }
58
    }
59
    else
60
    {
61
        // No current_path - let the server decide
62
        return '';
63
    }
64
}
65
343 by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect
66
/* Starts the console server, if it isn't already.
67
 * This can be called any number of times - it only starts the one server.
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
68
 * Note that this is asynchronous. It will return after signalling to start
69
 * the server, but there is no guarantee that it has been started yet.
343 by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect
70
 * This is a separate step from console_init, as the server is only to be
71
 * started once the first command is entered.
72
 * Does not return a value. Writes to global variables
432 by drtomc
usrmgt: more work on this. Still some work to go.
73
 * server_host, and server_port.
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
74
 *
75
 * \param callback Function which will be called after the server has been
76
 * started. No parameters are passed. May be null.
217 by mattgiuca
Console: Python code generates a minimal document with a DIV and links to
77
 */
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
78
function start_server(callback)
217 by mattgiuca
Console: Python code generates a minimal document with a DIV and links to
79
{
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
80
    if (server_started)
81
    {
82
        callback();
83
        return;
84
    }
85
    var callback1 = function(xhr)
86
        {
87
            var json_text = xhr.responseText;
1060 by wagrant
Make IVLE work fine in Firefox 3.1 (ie. Gecko/XULRunner 1.9.1). Gecko 1.9.1 has
88
            server_key = JSON.parse(json_text).key;
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
89
            server_started = true;
90
            if (callback != null)
91
                callback();
92
        }
872 by dcoles
Console: Allow console to be started with a set working directory (defaults to
93
1340 by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333).
94
    ajax_call(
95
        callback1, "console", "service",
96
        {"ivle.op": "start", "cwd": get_console_start_directory()}, 
97
        "POST");
217 by mattgiuca
Console: Python code generates a minimal document with a DIV and links to
98
}
99
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
100
/** Initialises the console. All apps which import console are required to
101
 * call this function.
102
 * Optional "windowpane" (bool), if true, will cause the console to go into
103
 * "window pane" mode which will allow it to be opened and closed, and float
104
 * over the page.
105
 * (Defaults to closed).
106
 */
331 by mattgiuca
Console: Configured console to display properly as a "floating" window in the
107
function console_init(windowpane)
217 by mattgiuca
Console: Python code generates a minimal document with a DIV and links to
108
{
331 by mattgiuca
Console: Configured console to display properly as a "floating" window in the
109
    /* Set up the console as a floating pane */
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
110
    console_body = document.getElementById("console_body");
362 by mattgiuca
console: Automatically focus input box when starting console app, or when
111
    /* If there is no console body, don't worry.
112
     * (This lets us import console.js even on pages without a console box */
113
    if (console_body == null) return;
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
114
    console_filler = document.getElementById("console_filler");
331 by mattgiuca
Console: Configured console to display properly as a "floating" window in the
115
    if (windowpane)
339 by mattgiuca
console:
116
    {
117
        windowpane_mode = true;
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
118
        console_minimize();
339 by mattgiuca
console:
119
    }
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
120
}
121
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
122
/** Hide the main console panel, so the console minimizes to just an input box
123
 *  at the page bottom. */
124
function console_minimize()
125
{
339 by mattgiuca
console:
126
    if (!windowpane_mode) return;
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
127
    console_body.setAttribute("class", "windowpane minimal");
128
    console_filler.setAttribute("class", "windowpane minimal");
129
}
130
131
/** Show the main console panel, so it enlarges out to its full size.
132
 */
133
function console_maximize()
134
{
339 by mattgiuca
console:
135
    if (!windowpane_mode) return;
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
136
    console_body.setAttribute("class", "windowpane maximal");
137
    console_filler.setAttribute("class", "windowpane maximal");
138
}
139
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
140
/* current_text is the string currently on the command line.
141
 * If non-empty, it will be stored at the bottom of the history.
142
 */
143
function historyUp(current_text)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
144
{
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
145
    /* Remember the changes made to this item */
146
    this.edited[this.cursor] = current_text;
147
    if (this.cursor > 0)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
148
    {
149
        this.cursor--;
150
    }
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
151
    this.earliestCursor = this.cursor;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
152
}
153
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
154
function historyDown(current_text)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
155
{
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
156
    /* Remember the changes made to this item */
157
    this.edited[this.cursor] = current_text;
158
    if (this.cursor < this.items.length - 1)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
159
    {
160
        this.cursor++;
161
    }
162
}
163
164
function historyCurr()
165
{
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
166
    return this.edited[this.cursor];
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
167
}
168
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
169
function historySubmit(text)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
170
{
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
171
    /* Copy the selected item's "edited" version over the permanent version of
172
     * the last item. */
173
    this.items[this.items.length-1] = text;
174
    /* Add a new blank item */
175
    this.items[this.items.length] = "";
176
    this.cursor = this.items.length-1;
177
    /* Blow away all the edited versions, replacing them with the existing
178
     * items set.
179
     * Not the whole history - just start from the earliest edited one.
180
     * (This avoids slowdown over extended usage time).
181
     */
182
    for (var i=this.earliestCursor; i<=this.cursor; i++)
183
        this.edited[i] = this.items[i];
184
    this.earliestCursor = this.cursor;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
185
}
186
187
function historyShow()
188
{
189
    var res = "";
190
    for (var i = 0; i < this.items.length; i++)
191
    {
192
        if (i == this.cursor)
193
        {
194
            res += "["
195
        }
196
        res += this.items[i].toString();
197
        if (i == this.cursor)
198
        {
199
            res += "]"
200
        }
201
        res += " "
202
    }
203
    if (this.cursor == this.items.length)
204
    {
205
        res += "[]";
206
    }
207
    return res;
208
}
209
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
210
/* How history works
211
 * This is a fairly complex mechanism due to complications when editing
212
 * history items. We store two arrays. "items" is the permanent history of
213
 * each item. "edited" is a "volatile" version of items - the edits made to
214
 * the history between now and last time you hit "enter".
215
 * This is because the user can go back and edit any of the previous items,
216
 * and the edits are remembered until they hit enter.
217
 *
218
 * When hitting enter, the "edited" version of the currently selected item
219
 * replaces the "item" version of the last item in the list.
220
 * Then a new blank item is created, for the new line of input.
221
 * Lastly, all the "edited" versions are replaced with their stable versions.
222
 *
223
 * Cursor never points to an invalid location.
224
 */
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
225
function History()
226
{
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
227
    this.items = new Array("");
228
    this.edited = new Array("");
229
    this.cursor = 0;
230
    this.earliestCursor = 0;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
231
    this.up = historyUp;
232
    this.down = historyDown;
233
    this.curr = historyCurr;
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
234
    this.submit = historySubmit;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
235
    this.show = historyShow;
236
}
237
238
var hist = new History();
239
628 by drtomc
console: Add output based interrupt. This allows users to interrupt long
240
function set_interrupt()
241
{
242
    interrupted = true;
243
}
244
245
function clear_output()
246
{
247
    var output = document.getElementById("console_output");
248
    while (output.firstChild)
249
    {
250
        output.removeChild(output.firstChild);
251
    }
252
}
253
333 by mattgiuca
console.js: enter_line now accepts the line as an argument instead of reading
254
/** Send a line of text to the Python server, wait for its return, and react
255
 * to its response by writing to the output box.
256
 * Also maximize the console window if not already.
257
 */
590 by mattgiuca
console: Added disabling of the input box when waiting for a response from the
258
function console_enter_line(inputbox, which)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
259
{
628 by drtomc
console: Add output based interrupt. This allows users to interrupt long
260
    interrupted = false;
261
593 by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line
262
    if (typeof(inputbox) == "string")
263
    {
1153 by William Grant
In the console, append a newline to the end of a submitted block of code.
264
        var inputline = inputbox + "\n";
593 by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line
265
        inputbox = null;
266
    }
267
    else
268
    {
1099.5.3 by William Grant
Disable the console input textbox at the start of the submission process,
269
        /* Disable the text box */
270
        inputbox.setAttribute("disabled", "disabled");
271
1062 by wagrant
Console input from the text box now has a linefeed appended by the browser. We
272
        var inputline = inputbox.value + "\n";
593 by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line
273
    }
618 by drtomc
console: Get rid of all the extra pre elements.
274
    var output = document.getElementById("console_output");
275
    {
654 by mattgiuca
console.js|css:
276
        // Print ">>>" span
277
        var span = document.createElement("span");
278
        span.setAttribute("class", "inputPrompt");
1064 by wagrant
The browser console now uses the correct prompt in the log pane - previously
279
        span.appendChild(document.createTextNode(
1171 by William Grant
Replace all uses of .textContent with .nodeValue.
280
              document.getElementById("console_prompt").firstChild.nodeValue)
1064 by wagrant
The browser console now uses the correct prompt in the log pane - previously
281
                        );
654 by mattgiuca
console.js|css:
282
        output.appendChild(span);
283
        // Print input line itself in a span
618 by drtomc
console: Get rid of all the extra pre elements.
284
        var span = document.createElement("span");
285
        span.setAttribute("class", "inputMsg");
1062 by wagrant
Console input from the text box now has a linefeed appended by the browser. We
286
        span.appendChild(document.createTextNode(inputline));
618 by drtomc
console: Get rid of all the extra pre elements.
287
        output.appendChild(span);
288
    }
1340 by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333).
289
    var args = {
290
        "ivle.op": "chat", "kind": which, "key": server_key,
291
        "text": inputline, "cwd": get_console_start_directory()
292
        };
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
293
    var callback = function(xhr)
294
        {
1099.5.1 by William Grant
Disable the console input textbox properly, and don't set the colour
295
            console_response(inputbox, inputline, xhr.responseText);
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
296
        }
1099.1.29 by William Grant
ivle.webapp.console.service: Port www/apps/consoleservice to new framework.
297
    ajax_call(callback, "console", "service", args, "POST");
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
298
}
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
299
1099.5.1 by William Grant
Disable the console input textbox properly, and don't set the colour
300
function console_response(inputbox, inputline, responseText)
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
301
{
646 by drtomc
console: - work around the ff bug with the cursor.
302
    try
303
    {
304
        var res = JSON.parse(responseText);
305
    }
306
    catch (e)
307
    {
308
        alert("An internal error occurred in the python console.");
309
        return;
310
    }
328 by mattgiuca
console: Renamed HTML element IDs to prefix "console_".
311
    var output = document.getElementById("console_output");
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
312
    if (res.hasOwnProperty('okay'))
313
    {
991 by dcoles
Console: Some improvements to the python console code - most notably the
314
        // Success!
315
        if (res.okay)
316
        {
317
            output.appendChild(document.createTextNode(res.okay + "\n"));
318
            output.appendChild(span);
319
        }
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
320
        // set the prompt to >>>
991 by dcoles
Console: Some improvements to the python console code - most notably the
321
        set_prompt(">>>");
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
322
    }
323
    else if (res.hasOwnProperty('exc'))
324
    {
325
        // Failure!
326
        // print out the error message (res.exc)
991 by dcoles
Console: Some improvements to the python console code - most notably the
327
        print_error(res.exc);
328
        
654 by mattgiuca
console.js|css:
329
        // set the prompt to >>>
991 by dcoles
Console: Some improvements to the python console code - most notably the
330
        set_prompt(">>>");
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
331
    }
737 by dcoles
Console: The consoleservice is now able to work out when a console has timed
332
    else if (res.hasOwnProperty('restart') && res.hasOwnProperty('key'))
333
    {
334
        // Server has indicated that the console should be restarted
335
        
336
        // Get the new key (host, port, magic)
337
        server_key = res.key;
338
339
        // Print a reason to explain why we'd do such a horrible thing
340
        // (console timeout, server error etc.)
991 by dcoles
Console: Some improvements to the python console code - most notably the
341
        print_error("Console Restart: " + res.restart);
342
        
737 by dcoles
Console: The consoleservice is now able to work out when a console has timed
343
        // set the prompt to >>>
991 by dcoles
Console: Some improvements to the python console code - most notably the
344
        set_prompt(">>>");
737 by dcoles
Console: The consoleservice is now able to work out when a console has timed
345
    }
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
346
    else if (res.hasOwnProperty('more'))
347
    {
348
        // Need more input, so set the prompt to ...
991 by dcoles
Console: Some improvements to the python console code - most notably the
349
        set_prompt("...");
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
350
    }
598 by drtomc
console: send output back to the browser progressively.
351
    else if (res.hasOwnProperty('output'))
352
    {
599 by drtomc
console: improve end of line handling.
353
        if (res.output.length > 0)
598 by drtomc
console: send output back to the browser progressively.
354
        {
618 by drtomc
console: Get rid of all the extra pre elements.
355
            output.appendChild(document.createTextNode(res.output));
598 by drtomc
console: send output back to the browser progressively.
356
        }
357
        var callback = function(xhr)
358
            {
1099.5.1 by William Grant
Disable the console input textbox properly, and don't set the colour
359
                console_response(inputbox, null, xhr.responseText);
598 by drtomc
console: send output back to the browser progressively.
360
            }
628 by drtomc
console: Add output based interrupt. This allows users to interrupt long
361
        if (interrupted)
362
        {
363
            var kind = "interrupt";
364
        }
365
        else
366
        {
367
            var kind = "chat";
368
        }
1340 by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333).
369
        var args = {
370
            "ivle.op": "chat", "kind": kind, "key": server_key,
371
            "text": '', "cwd": get_console_start_directory()
372
            };
1099.1.29 by William Grant
ivle.webapp.console.service: Port www/apps/consoleservice to new framework.
373
        ajax_call(callback, "console", "service", args, "POST");
623 by drtomc
console: fix a minor styling flaw.
374
629 by drtomc
console: a couple of minor tweaks arising from conversation with Adrian.
375
        // Open up the console so we can see the output
376
        // FIXME: do we need to maximize here?
623 by drtomc
console: fix a minor styling flaw.
377
        console_maximize();
629 by drtomc
console: a couple of minor tweaks arising from conversation with Adrian.
378
623 by drtomc
console: fix a minor styling flaw.
379
        /* Auto-scrolling */
380
        divScroll.activeScroll();
381
598 by drtomc
console: send output back to the browser progressively.
382
        // Return early, so we don't re-enable the input box.
383
        return;
384
    }
991 by dcoles
Console: Some improvements to the python console code - most notably the
385
    else
386
    {
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
387
        // assert res.hasOwnProperty('input')
991 by dcoles
Console: Some improvements to the python console code - most notably the
388
        set_prompt("...");
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
389
    }
598 by drtomc
console: send output back to the browser progressively.
390
391
    if (inputbox != null)
392
    {
393
        /* Re-enable the text box */
394
        inputbox.removeAttribute("disabled");
628 by drtomc
console: Add output based interrupt. This allows users to interrupt long
395
        interrupted = false;
598 by drtomc
console: send output back to the browser progressively.
396
    }
397
332 by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be
398
    /* Open up the console so we can see the output */
399
    console_maximize();
616 by agdimech
/console/console.js: Added dynamic scrolling for the console.
400
    /* Auto-scrolling */
401
    divScroll.activeScroll();
629 by drtomc
console: a couple of minor tweaks arising from conversation with Adrian.
402
403
    // Focus the input box by default
991 by dcoles
Console: Some improvements to the python console code - most notably the
404
    document.getElementById("console_output").focus();
405
    document.getElementById("console_inputText").focus();
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
406
}
407
408
function catch_input(key)
409
{
328 by mattgiuca
console: Renamed HTML element IDs to prefix "console_".
410
    var inp = document.getElementById('console_inputText');
339 by mattgiuca
console:
411
    switch (key)
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
412
    {
339 by mattgiuca
console:
413
    case 9:                 /* Tab key */
414
        var selstart = inp.selectionStart;
415
        var selend = inp.selectionEnd;
416
        if (selstart == selend)
417
        {
418
            /* No selection, just a carat. Insert a tab here. */
419
            inp.value = inp.value.substr(0, selstart)
420
                + TAB_STRING + inp.value.substr(selstart);
421
        }
422
        else
423
        {
424
            /* Text is selected. Just indent the whole line
425
             * by inserting a tab at the start */
426
            inp.value = TAB_STRING + inp.value;
427
        }
428
        /* Update the selection so the same characters as before are selected
429
         */
430
        inp.selectionStart = selstart + TAB_STRING.length;
431
        inp.selectionEnd = inp.selectionStart + (selend - selstart);
432
        /* Cancel the event, so the TAB key doesn't move focus away from this
433
         * box */
434
        return false;
435
        /* Note: If it happens that some browsers don't support event
436
         * cancelling properly, this hack might work instead:
437
        setTimeout(
438
            "document.getElementById('console_inputText').focus()",
439
            0);
440
         */
441
        break;
442
    case 13:                /* Enter key */
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
443
        var callback = function()
444
        {
445
            /* Send the line of text to the server */
590 by mattgiuca
console: Added disabling of the input box when waiting for a response from the
446
            console_enter_line(inp, "chat");
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
447
            hist.submit(inp.value);
448
            inp.value = hist.curr();
449
        }
1341 by William Grant
Disable the console input textbox while starting the server.
450
451
        /* Disable the text box. This will be redone by
452
         * console_enter_line, but we do it here too in case start_server
453
         * takes a while.
454
         */
455
        inp.setAttribute("disabled", "disabled");
559 by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not
456
        /* Start the server if it hasn't already been started */
457
        start_server(callback);
339 by mattgiuca
console:
458
        break;
459
    case 38:                /* Up arrow */
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
460
        hist.up(inp.value);
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
461
        inp.value = hist.curr();
1308 by William Grant
Unbreak console history retrieval in IE/WebKit.
462
        /* Inhibit further responses to this event, or WebKit moves the
463
         * cursor to the start. */
464
        return false;
339 by mattgiuca
console:
465
        break;
466
    case 40:                /* Down arrow */
350 by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and
467
        hist.down(inp.value);
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
468
        inp.value = hist.curr();
1308 by William Grant
Unbreak console history retrieval in IE/WebKit.
469
        return false;
339 by mattgiuca
console:
470
        break;
276 by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate
471
    }
217 by mattgiuca
Console: Python code generates a minimal document with a DIV and links to
472
}
616 by agdimech
/console/console.js: Added dynamic scrolling for the console.
473
991 by dcoles
Console: Some improvements to the python console code - most notably the
474
/** Resets the console by signalling the old console to expire and starting a 
475
 * new one.
476
 */
477
function console_reset()
478
{
479
    // FIXME: We show some feedback here - either disable input or at very 
480
    // least the reset button.
481
482
    // Restart the console
483
    if(!server_started)
484
    {
485
        start_server(null);
486
    }
487
    else
488
    {
1340 by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333).
489
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key, "cwd": get_console_start_directory()}, "POST");
1156 by William Grant
Remove an extra argument to console_response() in console_reset(). Fixes
490
        console_response(null, null, xhr.responseText);
991 by dcoles
Console: Some improvements to the python console code - most notably the
491
    }
492
}
493
494
/** Prints an error line in the console **/
495
function print_error(error)
496
{ 
497
    var output = document.getElementById("console_output");
498
  
499
    // Create text block
500
    var span = document.createElement("span");
501
    span.setAttribute("class", "errorMsg");
502
    span.appendChild(document.createTextNode(error + "\n"));
503
    output.appendChild(span);
504
505
    // Autoscroll
506
    divScroll.activeScroll();
507
}
508
509
/** Sets the prompt text **/
510
function set_prompt(prompt_text)
511
{
512
    var prompt = document.getElementById("console_prompt");
513
    prompt.replaceChild(document.createTextNode(prompt_text + " "), prompt.firstChild);
514
}
515
616 by agdimech
/console/console.js: Added dynamic scrolling for the console.
516
/**** Following Code modified from ******************************************/
517
/**** http://radio.javaranch.com/pascarello/2006/08/17/1155837038219.html ***/
518
/****************************************************************************/
519
var chatscroll = new Object();
520
521
chatscroll.Pane = function(scrollContainerId)
522
{
523
    this.scrollContainerId = scrollContainerId;
524
}
525
526
chatscroll.Pane.prototype.activeScroll = function()
527
{
528
    var scrollDiv = document.getElementById(this.scrollContainerId);
529
    var currentHeight = 0;
530
        
531
    if (scrollDiv.scrollHeight > 0)
532
        currentHeight = scrollDiv.scrollHeight;
991 by dcoles
Console: Some improvements to the python console code - most notably the
533
    else if (scrollDiv.offsetHeight > 0)
534
        currentHeight = scrollDiv.offsetHeight;
616 by agdimech
/console/console.js: Added dynamic scrolling for the console.
535
536
    scrollDiv.scrollTop = currentHeight;
537
538
    scrollDiv = null;
539
}
540
541
var divScroll = new chatscroll.Pane('console_output');