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

« back to all changes in this revision

Viewing changes to www/media/common/util.js

  • Committer: dcoles
  • Date: 2008-04-28 04:12:35 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:750
Console: Flush current output before requesting input from Web

This makes raw_input() and other interactive scripts behave in a usable 
fashion.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
/* Expects the following variables to have been declared by JavaScript in
26
26
 * the HTML generated by the server:
27
27
 * - root_dir
 
28
 * - public_host
28
29
 * - username
29
30
 */
30
31
 
341
342
    return path;
342
343
}
343
344
 
 
345
/** Writes a JSONable object to the cookie under a particular key
 
346
 * (JSON encoded and URL encoded).
 
347
 */
 
348
function write_cookie(key, value)
 
349
{
 
350
    var sendstr = encodeURIComponent(key) + "="
 
351
        + encodeURIComponent(JSON.stringify(value))
 
352
        + "; path=" + urlencode_path(root_dir);
 
353
    /* This actually just assigns to the key, not replacing the whole cookie
 
354
     * as it appears to. */
 
355
    document.cookie = sendstr;
 
356
}
 
357
/** Reads a cookie which has a JSONable object encoded as its value.
 
358
 * Returns the object, parsed from JSON.
 
359
 */
 
360
function read_cookie(key)
 
361
{
 
362
    var cookies = document.cookie.split(";");
 
363
    var checkstart = encodeURIComponent(key) + "=";
 
364
    var checklen = checkstart.length;
 
365
    for (var i=0; i<cookies.length; i++)
 
366
    {
 
367
        var cookie = cookies[i];
 
368
        while (cookie[0] == ' ')
 
369
            cookie = cookie.substr(1);
 
370
        if (cookie.substr(0, checklen) == checkstart)
 
371
        {
 
372
            var valstr = cookie.substr(checklen);
 
373
            valstr = decodeURIComponent(valstr);
 
374
            return JSON.parse(valstr);
 
375
        }
 
376
    }
 
377
}
 
378
 
344
379
/** Given an argument map, as output in the args parameter of the return of
345
380
 * parseurl, gets the first occurence of an argument in the URL string.
346
381
 * If the argument was not found, returns null.
477
512
    return make_path(path_join.apply(null, arguments));
478
513
}
479
514
 
 
515
/** Generates an absolute URL to a public application
 
516
 */
 
517
function public_app_path(app /*,...*/)
 
518
{
 
519
    return location.protocol + "//" + public_host
 
520
        + make_path(path_join.apply(null, arguments));
 
521
}
 
522
 
480
523
/** Given a path, gets the "basename" (the last path segment).
481
524
 */
482
525
function path_basename(path)
519
562
    arr.splice(j, i-j);
520
563
}
521
564
 
522
 
/** Makes an XMLHttpRequest call to the server. Waits (synchronously) for a
523
 
 * response, and returns an XMLHttpRequest object containing the completed
524
 
 * response.
 
565
/** Shallow-clones an object */
 
566
function shallow_clone_object(obj)
 
567
{
 
568
    o = {};
 
569
    for (k in obj)
 
570
        o[k] = obj[k];
 
571
    return o;
 
572
}
 
573
 
 
574
/** Returns a new XMLHttpRequest object, in a somewhat browser-agnostic
 
575
 * fashion.
 
576
 */
 
577
function new_xmlhttprequest()
 
578
{
 
579
    try
 
580
    {
 
581
        /* Real Browsers */
 
582
        return new XMLHttpRequest();
 
583
    }
 
584
    catch (e)
 
585
    {
 
586
        /* Internet Explorer */
 
587
        try
 
588
        {
 
589
            return new ActiveXObject("Msxml2.XMLHTTP");
 
590
        }
 
591
        catch (e)
 
592
        {
 
593
            try
 
594
            {
 
595
                return new ActiveXObject("Microsoft.XMLHTTP");
 
596
            }
 
597
            catch (e)
 
598
            {
 
599
                throw("Your browser does not support AJAX. "
 
600
                    + "IVLE requires a modern browser.");
 
601
            }
 
602
        }
 
603
    }
 
604
}
 
605
 
 
606
/** Makes an asynchronous XMLHttpRequest call to the server.
 
607
 * Sends the XMLHttpRequest object containing the completed response to a
 
608
 * specified callback function.
525
609
 *
 
610
 * \param callback A callback function. Will be called when the response is
 
611
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
 
612
 *      completed response.
526
613
 * \param app IVLE app to call (such as "fileservice").
527
614
 * \param path URL path to make the request to, within the application.
528
615
 * \param args Argument object, as described in parse_url and friends.
530
617
 * \param content_type String, optional. Only applies if method is "POST".
531
618
 *      May be "application/x-www-form-urlencoded" or "multipart/form-data".
532
619
 *      Defaults to "application/x-www-form-urlencoded".
533
 
 * \return An XMLHttpRequest object containing the completed response.
534
620
 */
535
 
function ajax_call(app, path, args, method, content_type)
 
621
function ajax_call(callback, app, path, args, method, content_type)
536
622
{
537
623
    if (content_type != "multipart/form-data")
538
624
        content_type = "application/x-www-form-urlencoded";
542
628
     * (This is not checked against anywhere else, it is solely defined and
543
629
     * used within this function) */
544
630
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
545
 
    var xhr = new XMLHttpRequest();
 
631
    var xhr = new_xmlhttprequest();
 
632
    xhr.onreadystatechange = function()
 
633
        {
 
634
            if (xhr.readyState == 4)
 
635
            {
 
636
                callback(xhr);
 
637
            }
 
638
        }
546
639
    if (method == "GET")
547
640
    {
548
641
        /* GET sends the args in the URL */
549
642
        url = build_url({"path": path, "args": args});
550
 
        /* open's 3rd argument = false -> SYNCHRONOUS (wait for response)
551
 
         * (No need for a callback function) */
552
 
        xhr.open(method, url, false);
 
643
        /* open's 3rd argument = true -> asynchronous */
 
644
        xhr.open(method, url, true);
553
645
        xhr.send(null);
554
646
    }
555
647
    else
556
648
    {
557
649
        /* POST sends the args in application/x-www-form-urlencoded */
558
650
        url = encodeURI(path);
559
 
        xhr.open(method, url, false);
 
651
        xhr.open(method, url, true);
560
652
        var message;
561
653
        if (content_type == "multipart/form-data")
562
654
        {
572
664
        xhr.setRequestHeader("Content-Length", message.length);
573
665
        xhr.send(message);
574
666
    }
575
 
    return xhr;
576
667
}
577
668