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

« back to all changes in this revision

Viewing changes to www/media/console/console.js

  • Committer: mattgiuca
  • Date: 2008-02-05 01:41:15 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:409
Moved www/conf and www/common to a new directory lib. This separates the "web"
part of IVLE from what is becoming less web oriented (at least from Apache's
standpoint).
Modified setup.py to install this lib directory correctly and write conf in
the right place. Also adds the lib directory to ivle.pth.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 * Date: 30/1/2008
21
21
 */
22
22
 
23
 
var server_key;
 
23
digest_constant = "hello";
 
24
 
 
25
var server_host;
 
26
var server_port;
 
27
var server_magic;
24
28
 
25
29
/* Begin religious debate (tabs vs spaces) here: */
26
30
/* (This string will be inserted in the console when the user presses the Tab
34
38
windowpane_mode = false;
35
39
server_started = false;
36
40
 
37
 
interrupted = false;
38
 
 
39
41
/* Starts the console server, if it isn't already.
40
42
 * This can be called any number of times - it only starts the one server.
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.
43
43
 * This is a separate step from console_init, as the server is only to be
44
44
 * started once the first command is entered.
45
45
 * Does not return a value. Writes to global variables
46
 
 * server_host, and server_port.
47
 
 *
48
 
 * \param callback Function which will be called after the server has been
49
 
 * started. No parameters are passed. May be null.
 
46
 * server_host, server_port, server_magic.
50
47
 */
51
 
function start_server(callback)
 
48
function start_server()
52
49
{
53
 
    if (server_started)
54
 
    {
55
 
        callback();
56
 
        return;
57
 
    }
58
 
    var callback1 = function(xhr)
59
 
        {
60
 
            var json_text = xhr.responseText;
61
 
            server_key = JSON.parse(json_text);
62
 
            server_started = true;
63
 
            if (callback != null)
64
 
                callback();
65
 
        }
66
 
    ajax_call(callback1, "consoleservice", "start", {}, "POST");
 
50
    if (server_started) return;
 
51
    var xhr = ajax_call("consoleservice", "start", {}, "POST");
 
52
    var json_text = xhr.responseText;
 
53
    var server_info = JSON.parse(json_text);
 
54
    server_host = server_info.host;
 
55
    server_port = server_info.port;
 
56
    server_magic = server_info.magic;
 
57
    server_started = true;
67
58
}
68
59
 
69
60
/** Initialises the console. All apps which import console are required to
86
77
        windowpane_mode = true;
87
78
        console_minimize();
88
79
    }
 
80
    /* TEMP: Start the server now.
 
81
     * Ultimately we want the server to start only when a line is typed, but
 
82
     * it currently does it asynchronously and doesn't start in time for the
 
83
     * first line. */
 
84
    start_server();
89
85
}
90
86
 
91
87
/** Hide the main console panel, so the console minimizes to just an input box
104
100
    if (!windowpane_mode) return;
105
101
    console_body.setAttribute("class", "windowpane maximal");
106
102
    console_filler.setAttribute("class", "windowpane maximal");
 
103
    /* Focus the input box by default */
 
104
    document.getElementById("console_inputText").focus()
107
105
}
108
106
 
109
107
/* current_text is the string currently on the command line.
206
204
 
207
205
var hist = new History();
208
206
 
209
 
function set_interrupt()
210
 
{
211
 
    interrupted = true;
212
 
}
213
 
 
214
 
function clear_output()
215
 
{
216
 
    var output = document.getElementById("console_output");
217
 
    while (output.firstChild)
218
 
    {
219
 
        output.removeChild(output.firstChild);
220
 
    }
221
 
}
222
 
 
223
207
/** Send a line of text to the Python server, wait for its return, and react
224
208
 * to its response by writing to the output box.
225
209
 * Also maximize the console window if not already.
226
210
 */
227
 
function console_enter_line(inputbox, which)
228
 
{
229
 
    interrupted = false;
230
 
 
231
 
    if (typeof(inputbox) == "string")
232
 
    {
233
 
        var inputline = inputbox;
234
 
        inputbox = null;
235
 
        var graytimer = null;
236
 
    }
237
 
    else
238
 
    {
239
 
        GLOBAL_inputbox = inputbox;     /* For timer */
240
 
        var inputline = inputbox.value;
241
 
        var graytimer = setTimeout("GLOBAL_inputbox.setAttribute(\"class\", "
242
 
            + "\"disabled\");", 100);
243
 
    }
244
 
    var output = document.getElementById("console_output");
245
 
    {
246
 
        // Print ">>>" span
247
 
        var span = document.createElement("span");
248
 
        span.setAttribute("class", "inputPrompt");
249
 
        span.appendChild(document.createTextNode(">>> "));
250
 
        output.appendChild(span);
251
 
        // Print input line itself in a span
252
 
        var span = document.createElement("span");
253
 
        span.setAttribute("class", "inputMsg");
254
 
        span.appendChild(document.createTextNode(inputline + "\n"));
255
 
        output.appendChild(span);
256
 
    }
257
 
    var args = {"key": server_key, "text":inputline};
258
 
    var callback = function(xhr)
259
 
        {
260
 
            console_response(inputbox, graytimer, inputline, xhr.responseText);
261
 
        }
262
 
    /* Disable the text box */
263
 
    if (inputbox != null)
264
 
        inputbox.setAttribute("disabled", "disabled");
265
 
    ajax_call(callback, "consoleservice", which, args, "POST");
266
 
}
267
 
 
268
 
function console_response(inputbox, graytimer, inputline, responseText)
269
 
{
270
 
    try
271
 
    {
272
 
        var res = JSON.parse(responseText);
273
 
    }
274
 
    catch (e)
275
 
    {
276
 
        alert("An internal error occurred in the python console.");
277
 
        return;
278
 
    }
279
 
    var output = document.getElementById("console_output");
 
211
function console_enter_line(inputline, which)
 
212
{
 
213
    /* Start the server if it hasn't already been started */
 
214
    start_server();
 
215
    var digest = hex_md5(inputline + server_magic);
 
216
    var args = {"host": server_host, "port": server_port,
 
217
                    "digest":digest, "text":inputline};
 
218
    var xmlhttp = ajax_call("consoleservice", which, args, "POST");
 
219
 
 
220
    var res = JSON.parse(xmlhttp.responseText);
 
221
    var output = document.getElementById("console_output");
 
222
    {
 
223
        var pre = document.createElement("pre");
 
224
        pre.setAttribute("class", "inputMsg");
 
225
        pre.appendChild(document.createTextNode(inputline + "\n"));
 
226
        output.appendChild(pre);
 
227
    }
280
228
    if (res.hasOwnProperty('okay'))
281
229
    {
282
230
        // Success!
283
 
        if (res.okay)
 
231
        // print out the output (res.okay[0])
 
232
        var pre = document.createElement("pre");
 
233
        pre.setAttribute("class", "outputMsg");
 
234
        pre.appendChild(document.createTextNode(res.okay[0]));
 
235
        output.appendChild(pre);
 
236
        // print out the return value (res.okay[1])
 
237
        if (res.okay[1])
284
238
        {
285
 
            output.appendChild(document.createTextNode(res.okay + "\n"));
286
 
            output.appendChild(span);
 
239
            var pre = document.createElement("pre");
 
240
            pre.setAttribute("class", "outputMsg");
 
241
            pre.appendChild(document.createTextNode(res.okay[1] + "\n"));
 
242
            output.appendChild(pre);
287
243
        }
288
244
        // set the prompt to >>>
289
245
        var prompt = document.getElementById("console_prompt");
292
248
    else if (res.hasOwnProperty('exc'))
293
249
    {
294
250
        // Failure!
 
251
        // print out any output that came before the error
 
252
        if (res.exc[0].length > 0)
 
253
        {
 
254
            var pre = document.createElement("pre");
 
255
            pre.setAttribute("class", "outputMsg");
 
256
            pre.appendChild(document.createTextNode(res.exc[0]));
 
257
            output.appendChild(pre);
 
258
        }
 
259
 
295
260
        // print out the error message (res.exc)
296
 
        var span = document.createElement("span");
297
 
        span.setAttribute("class", "errorMsg");
298
 
        span.appendChild(document.createTextNode(res.exc + "\n"));
299
 
        output.appendChild(span);
300
 
        // set the prompt to >>>
301
 
        var prompt = document.getElementById("console_prompt");
302
 
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
 
261
        var pre = document.createElement("pre");
 
262
        pre.setAttribute("class", "errorMsg");
 
263
        pre.appendChild(document.createTextNode(res.exc[1]));
 
264
        output.appendChild(pre);
303
265
    }
304
266
    else if (res.hasOwnProperty('more'))
305
267
    {
307
269
        var prompt = document.getElementById("console_prompt");
308
270
        prompt.replaceChild(document.createTextNode("... "), prompt.firstChild);
309
271
    }
310
 
    else if (res.hasOwnProperty('output'))
311
 
    {
312
 
        if (res.output.length > 0)
313
 
        {
314
 
            output.appendChild(document.createTextNode(res.output));
315
 
        }
316
 
        var callback = function(xhr)
317
 
            {
318
 
                console_response(inputbox, graytimer,
319
 
                                 null, xhr.responseText);
320
 
            }
321
 
        if (interrupted)
322
 
        {
323
 
            var kind = "interrupt";
324
 
        }
325
 
        else
326
 
        {
327
 
            var kind = "chat";
328
 
        }
329
 
        var args = {"key": server_key, "text":''};
330
 
        ajax_call(callback, "consoleservice", kind, args, "POST");
331
 
 
332
 
        // Open up the console so we can see the output
333
 
        // FIXME: do we need to maximize here?
334
 
        console_maximize();
335
 
 
336
 
        /* Auto-scrolling */
337
 
        divScroll.activeScroll();
338
 
 
339
 
        // Return early, so we don't re-enable the input box.
340
 
        return;
341
 
    }
342
272
    else {
343
273
        // assert res.hasOwnProperty('input')
344
274
        var prompt = document.getElementById("console_prompt");
345
275
        prompt.replaceChild(document.createTextNode("+++ "), prompt.firstChild);
346
276
    }
347
 
 
348
 
    if (inputbox != null)
349
 
    {
350
 
        /* Re-enable the text box */
351
 
        clearTimeout(graytimer);
352
 
        inputbox.removeAttribute("disabled");
353
 
        inputbox.removeAttribute("class");
354
 
        interrupted = false;
355
 
    }
356
 
 
357
277
    /* Open up the console so we can see the output */
358
278
    console_maximize();
359
 
    /* Auto-scrolling */
360
 
    divScroll.activeScroll();
361
 
 
362
 
    // Focus the input box by default
363
 
    document.getElementById("console_output").focus()
364
 
    document.getElementById("console_inputText").focus()
365
279
}
366
280
 
367
281
function catch_input(key)
399
313
         */
400
314
        break;
401
315
    case 13:                /* Enter key */
402
 
        var callback = function()
403
 
        {
404
 
            /* Send the line of text to the server */
405
 
            console_enter_line(inp, "chat");
406
 
            hist.submit(inp.value);
407
 
            inp.value = hist.curr();
408
 
        }
409
 
        /* Start the server if it hasn't already been started */
410
 
        start_server(callback);
 
316
        /* Send the line of text to the server */
 
317
        console_enter_line(inp.value, "chat");
 
318
        hist.submit(inp.value);
 
319
        inp.value = hist.curr();
411
320
        break;
412
321
    case 38:                /* Up arrow */
413
322
        hist.up(inp.value);
419
328
        break;
420
329
    }
421
330
}
422
 
 
423
 
/**** Following Code modified from ******************************************/
424
 
/**** http://radio.javaranch.com/pascarello/2006/08/17/1155837038219.html ***/
425
 
/****************************************************************************/
426
 
var chatscroll = new Object();
427
 
 
428
 
chatscroll.Pane = function(scrollContainerId)
429
 
{
430
 
    this.scrollContainerId = scrollContainerId;
431
 
}
432
 
 
433
 
chatscroll.Pane.prototype.activeScroll = function()
434
 
{
435
 
    var scrollDiv = document.getElementById(this.scrollContainerId);
436
 
    var currentHeight = 0;
437
 
        
438
 
    if (scrollDiv.scrollHeight > 0)
439
 
        currentHeight = scrollDiv.scrollHeight;
440
 
    else 
441
 
        if (objDiv.offsetHeight > 0)
442
 
            currentHeight = scrollDiv.offsetHeight;
443
 
 
444
 
    scrollDiv.scrollTop = currentHeight;
445
 
 
446
 
    scrollDiv = null;
447
 
}
448
 
 
449
 
var divScroll = new chatscroll.Pane('console_output');