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