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

« back to all changes in this revision

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

  • Committer: mattgiuca
  • Date: 2008-07-07 12:01:03 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:820
lib: Added new package pulldown_subj, a collection of modules designed to
    pull student subject enrolments from the server.
    Note that the actual code to do this is not included (since that is
    specific to the organisation running IVLE) - just a pluggable interface
    and an example plugin module.
configure.py: Added new config option: subject_pulldown_modules, which allows
    you to specify which modules are plugged in here.
    (Actually that was added accidentally in a previous commit; but this
    revision fixes some comments).

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
 
278
279
            query_string += "&" + encodeURIComponent(arg_key) + "=" +
279
280
                encodeURIComponent(arg_val);
280
281
    }
281
 
    if (query_string == "")
282
 
        query_string = null;
283
 
    else
 
282
    if (query_string != "")
284
283
        /* Drop the first "&" */
285
284
        query_string = query_string.substr(1);
286
285
 
312
311
    if (("path" in obj) && obj.path != null)
313
312
    {
314
313
        var path = urlencode_path(obj.path.toString());
315
 
        if (url.length > 0 && path.length > 0 && path[0] != "/")
 
314
        if (url.length > 0 && path.length > 0 && path.charAt(0) != "/")
316
315
            path = "/" + path;
317
316
        url += path;
318
317
    }
321
320
    else if (("args" in obj) && obj.args != null)
322
321
        query_string = make_query_string(obj.args);
323
322
 
324
 
    if (query_string != null)
 
323
    if (query_string != "" && query_string != null)
325
324
        url += "?" + query_string;
326
325
 
327
326
    return url;
343
342
    return path;
344
343
}
345
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
 
346
379
/** Given an argument map, as output in the args parameter of the return of
347
380
 * parseurl, gets the first occurence of an argument in the URL string.
348
381
 * If the argument was not found, returns null.
393
426
    {
394
427
        arg = arguments[i];
395
428
        if (arg.length == 0) continue;
396
 
        if (arg[0] == '/')
 
429
        if (arg.charAt(0) == '/')
397
430
            path = arg;
398
431
        else
399
432
        {
400
 
            if (path.length > 0 && path[path.length-1] != '/')
 
433
            if (path.length > 0 && path.charAt(path.length-1) != '/')
401
434
                path += '/';
402
435
            path += arg;
403
436
        }
458
491
function pathlist_to_path(pathlist)
459
492
{
460
493
    ret = path_join.apply(null, pathlist);
461
 
    if (ret[ret.length-1] != '/')
 
494
    if (ret.charAt(ret.length-1) != '/')
462
495
        ret += '/';
463
496
    return ret;
464
497
}
479
512
    return make_path(path_join.apply(null, arguments));
480
513
}
481
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
 
482
523
/** Given a path, gets the "basename" (the last path segment).
483
524
 */
484
525
function path_basename(path)
521
562
    arr.splice(j, i-j);
522
563
}
523
564
 
524
 
/** Makes an XMLHttpRequest call to the server. Waits (synchronously) for a
525
 
 * response, and returns an XMLHttpRequest object containing the completed
526
 
 * 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
/** Creates a random string of length length,
 
607
 * consisting of alphanumeric characters.
 
608
 */
 
609
var rand_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
 
610
               + "abcdefghiklmnopqrstuvwxyz";
 
611
function random_string(length)
 
612
{
 
613
    var str = Array(length);
 
614
    var v;
 
615
    for (var i=0; i<length; i++)
 
616
    {
 
617
        v = Math.floor(Math.random() * rand_chars.length);
 
618
        str[i] = rand_chars.charAt(v);
 
619
    }
 
620
    return str.join('');
 
621
}
 
622
 
 
623
/** Makes an asynchronous XMLHttpRequest call to the server.
 
624
 * Sends the XMLHttpRequest object containing the completed response to a
 
625
 * specified callback function.
527
626
 *
 
627
 * \param callback A callback function. Will be called when the response is
 
628
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
 
629
 *      completed response.
528
630
 * \param app IVLE app to call (such as "fileservice").
529
631
 * \param path URL path to make the request to, within the application.
530
632
 * \param args Argument object, as described in parse_url and friends.
532
634
 * \param content_type String, optional. Only applies if method is "POST".
533
635
 *      May be "application/x-www-form-urlencoded" or "multipart/form-data".
534
636
 *      Defaults to "application/x-www-form-urlencoded".
535
 
 * \return An XMLHttpRequest object containing the completed response.
536
637
 */
537
 
function ajax_call(app, path, args, method, content_type)
 
638
function ajax_call(callback, app, path, args, method, content_type)
538
639
{
539
640
    if (content_type != "multipart/form-data")
540
641
        content_type = "application/x-www-form-urlencoded";
543
644
    /* A random string, for multipart/form-data
544
645
     * (This is not checked against anywhere else, it is solely defined and
545
646
     * used within this function) */
546
 
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
547
 
    var xhr = new XMLHttpRequest();
 
647
    var boundary = random_string(20);
 
648
    var xhr = new_xmlhttprequest();
 
649
    xhr.onreadystatechange = function()
 
650
        {
 
651
            if (xhr.readyState == 4)
 
652
            {
 
653
                callback(xhr);
 
654
            }
 
655
        }
548
656
    if (method == "GET")
549
657
    {
550
658
        /* GET sends the args in the URL */
551
659
        url = build_url({"path": path, "args": args});
552
 
        /* open's 3rd argument = false -> SYNCHRONOUS (wait for response)
553
 
         * (No need for a callback function) */
554
 
        xhr.open(method, url, false);
 
660
        /* open's 3rd argument = true -> asynchronous */
 
661
        xhr.open(method, url, true);
555
662
        xhr.send(null);
556
663
    }
557
664
    else
558
665
    {
559
666
        /* POST sends the args in application/x-www-form-urlencoded */
560
667
        url = encodeURI(path);
561
 
        xhr.open(method, url, false);
 
668
        xhr.open(method, url, true);
562
669
        var message;
563
670
        if (content_type == "multipart/form-data")
564
671
        {
565
672
            xhr.setRequestHeader("Content-Type",
566
 
                "multipart/form-data, boundary=" + boundary);
 
673
                "multipart/form-data; boundary=" + boundary);
567
674
            message = make_multipart_formdata(args, boundary);
568
675
        }
569
676
        else
573
680
        }
574
681
        xhr.send(message);
575
682
    }
576
 
    return xhr;
577
683
}
578
684