~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-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:
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
29
28
 * - username
30
29
 */
31
30
 
279
278
            query_string += "&" + encodeURIComponent(arg_key) + "=" +
280
279
                encodeURIComponent(arg_val);
281
280
    }
282
 
    if (query_string != "")
 
281
    if (query_string == "")
 
282
        query_string = null;
 
283
    else
283
284
        /* Drop the first "&" */
284
285
        query_string = query_string.substr(1);
285
286
 
311
312
    if (("path" in obj) && obj.path != null)
312
313
    {
313
314
        var path = urlencode_path(obj.path.toString());
314
 
        if (url.length > 0 && path.length > 0 && path.charAt(0) != "/")
 
315
        if (url.length > 0 && path.length > 0 && path[0] != "/")
315
316
            path = "/" + path;
316
317
        url += path;
317
318
    }
320
321
    else if (("args" in obj) && obj.args != null)
321
322
        query_string = make_query_string(obj.args);
322
323
 
323
 
    if (query_string != "" && query_string != null)
 
324
    if (query_string != null)
324
325
        url += "?" + query_string;
325
326
 
326
327
    return url;
342
343
    return path;
343
344
}
344
345
 
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
 
 
379
346
/** Given an argument map, as output in the args parameter of the return of
380
347
 * parseurl, gets the first occurence of an argument in the URL string.
381
348
 * If the argument was not found, returns null.
426
393
    {
427
394
        arg = arguments[i];
428
395
        if (arg.length == 0) continue;
429
 
        if (arg.charAt(0) == '/')
 
396
        if (arg[0] == '/')
430
397
            path = arg;
431
398
        else
432
399
        {
433
 
            if (path.length > 0 && path.charAt(path.length-1) != '/')
 
400
            if (path.length > 0 && path[path.length-1] != '/')
434
401
                path += '/';
435
402
            path += arg;
436
403
        }
491
458
function pathlist_to_path(pathlist)
492
459
{
493
460
    ret = path_join.apply(null, pathlist);
494
 
    if (ret.charAt(ret.length-1) != '/')
 
461
    if (ret[ret.length-1] != '/')
495
462
        ret += '/';
496
463
    return ret;
497
464
}
512
479
    return make_path(path_join.apply(null, arguments));
513
480
}
514
481
 
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
 
 
523
482
/** Given a path, gets the "basename" (the last path segment).
524
483
 */
525
484
function path_basename(path)
538
497
    return str.substr(str.length - substring.length) == substring;
539
498
}
540
499
 
 
500
/** Equivalent to Python's repr.
 
501
 * Gets the JavaScript string representation.
 
502
 * Actually just calls JSON.stringify.
 
503
 */
 
504
function repr(str)
 
505
{
 
506
    return JSON.stringify(str);
 
507
}
 
508
 
541
509
/** Removes all occurences of a value from an array.
542
510
 */
543
511
Array.prototype.removeall = function(val)
553
521
    arr.splice(j, i-j);
554
522
}
555
523
 
556
 
/** Shallow-clones an object */
557
 
function shallow_clone_object(obj)
558
 
{
559
 
    o = {};
560
 
    for (k in obj)
561
 
        o[k] = obj[k];
562
 
    return o;
563
 
}
564
 
 
565
 
/** Returns a new XMLHttpRequest object, in a somewhat browser-agnostic
566
 
 * fashion.
567
 
 */
568
 
function new_xmlhttprequest()
569
 
{
570
 
    try
571
 
    {
572
 
        /* Real Browsers */
573
 
        return new XMLHttpRequest();
574
 
    }
575
 
    catch (e)
576
 
    {
577
 
        /* Internet Explorer */
578
 
        try
579
 
        {
580
 
            return new ActiveXObject("Msxml2.XMLHTTP");
581
 
        }
582
 
        catch (e)
583
 
        {
584
 
            try
585
 
            {
586
 
                return new ActiveXObject("Microsoft.XMLHTTP");
587
 
            }
588
 
            catch (e)
589
 
            {
590
 
                throw("Your browser does not support AJAX. "
591
 
                    + "IVLE requires a modern browser.");
592
 
            }
593
 
        }
594
 
    }
595
 
}
596
 
 
597
 
/** Creates a random string of length length,
598
 
 * consisting of alphanumeric characters.
599
 
 */
600
 
var rand_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
601
 
               + "abcdefghiklmnopqrstuvwxyz";
602
 
function random_string(length)
603
 
{
604
 
    var str = Array(length);
605
 
    var v;
606
 
    for (var i=0; i<length; i++)
607
 
    {
608
 
        v = Math.floor(Math.random() * rand_chars.length);
609
 
        str[i] = rand_chars.charAt(v);
610
 
    }
611
 
    return str.join('');
612
 
}
613
 
 
614
 
/** Makes an XMLHttpRequest call to the server.
615
 
 * Sends the XMLHttpRequest object containing the completed response to a
616
 
 * specified callback function.
 
524
/** Makes an XMLHttpRequest call to the server. Waits (synchronously) for a
 
525
 * response, and returns an XMLHttpRequest object containing the completed
 
526
 * response.
617
527
 *
618
 
 * \param callback A callback function. Will be called when the response is
619
 
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
620
 
 *      completed response. If callback is null this is a syncronous request 
621
 
 *      otherwise this is an asynchronous request.
622
528
 * \param app IVLE app to call (such as "fileservice").
623
529
 * \param path URL path to make the request to, within the application.
624
530
 * \param args Argument object, as described in parse_url and friends.
625
 
 * \param method String; "GET", "POST", "PUT", or "PATCH"
626
 
 * \param content_type String, optional.
 
531
 * \param method String; "GET" or "POST"
 
532
 * \param content_type String, optional. Only applies if method is "POST".
 
533
 *      May be "application/x-www-form-urlencoded" or "multipart/form-data".
627
534
 *      Defaults to "application/x-www-form-urlencoded".
 
535
 * \return An XMLHttpRequest object containing the completed response.
628
536
 */
629
 
function ajax_call(callback, app, path, args, method, content_type)
 
537
function ajax_call(app, path, args, method, content_type)
630
538
{
631
 
    if (!content_type)
 
539
    if (content_type != "multipart/form-data")
632
540
        content_type = "application/x-www-form-urlencoded";
633
541
    path = app_path(app, path);
634
542
    var url;
635
543
    /* A random string, for multipart/form-data
636
544
     * (This is not checked against anywhere else, it is solely defined and
637
545
     * used within this function) */
638
 
    var boundary = random_string(20);
639
 
    var xhr = new_xmlhttprequest();
640
 
    var asyncronous = callback != null;
641
 
    if (asyncronous)
642
 
    {
643
 
        xhr.onreadystatechange = function()
644
 
            {
645
 
                if (xhr.readyState == 4)
646
 
                {
647
 
                    callback(xhr);
648
 
                }
649
 
            }
650
 
    }
 
546
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
 
547
    var xhr = new XMLHttpRequest();
651
548
    if (method == "GET")
652
549
    {
653
550
        /* GET sends the args in the URL */
654
551
        url = build_url({"path": path, "args": args});
655
 
        /* open's 3rd argument = true -> asynchronous */
656
 
        xhr.open(method, url, asyncronous);
 
552
        /* open's 3rd argument = false -> SYNCHRONOUS (wait for response)
 
553
         * (No need for a callback function) */
 
554
        xhr.open(method, url, false);
657
555
        xhr.send(null);
658
556
    }
659
557
    else
660
558
    {
661
 
        /* POST & PUT & PATCH sends the args in the request body */
 
559
        /* POST sends the args in application/x-www-form-urlencoded */
662
560
        url = encodeURI(path);
663
 
        xhr.open(method, url, asyncronous);
 
561
        xhr.open(method, url, false);
664
562
        var message;
665
563
        if (content_type == "multipart/form-data")
666
564
        {
667
565
            xhr.setRequestHeader("Content-Type",
668
 
                "multipart/form-data; boundary=" + boundary);
 
566
                "multipart/form-data, boundary=" + boundary);
669
567
            message = make_multipart_formdata(args, boundary);
670
568
        }
671
 
        else if (content_type == "application/x-www-form-urlencoded")
 
569
        else
672
570
        {
673
571
            xhr.setRequestHeader("Content-Type", content_type);
674
572
            message = make_query_string(args);
675
573
        }
676
 
        else if (content_type == "application/json")
677
 
        {
678
 
            xhr.setRequestHeader("Content-Type", content_type);
679
 
            message = JSON.stringify(args);
680
 
        }
681
 
        else
682
 
        {
683
 
            xhr.setRequestHeader("Content-Type", content_type);
684
 
            message = args;
685
 
        }
686
574
        xhr.send(message);
687
575
    }
688
 
    /* Only return the XHR for syncronous requests */
689
 
    if (!asyncronous)
690
 
    { 
691
 
        return xhr;
692
 
    }
 
576
    return xhr;
693
577
}
694
578
 
695
 
/** Attempts to JSON decodes a response object
696
 
 * If a non-200 response or the JSON decode fails then returns null
697
 
 */
698
 
function decode_response(response)
699
 
{
700
 
    if (response.status == 200)
701
 
    {
702
 
        try
703
 
        {
704
 
            var responseText = response.responseText;
705
 
            return JSON.parse(responseText);
706
 
        }
707
 
        catch (e)
708
 
        {
709
 
            // Pass
710
 
        }
711
 
     }
712
 
    
713
 
     return null;
714
 
}