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

« back to all changes in this revision

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

  • Committer: chadnickbok
  • Date: 2009-02-02 04:00:25 UTC
  • Revision ID: svn-v4:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1189
Adding the changes from my genshi branch into trunk.

Most apps now use the Genshi templating engine, in preparation
for future changes to dispatch

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
 
310
311
    if (("path" in obj) && obj.path != null)
311
312
    {
312
313
        var path = urlencode_path(obj.path.toString());
313
 
        if (url.length > 0 && path.length > 0 && path[0] != "/")
 
314
        if (url.length > 0 && path.length > 0 && path.charAt(0) != "/")
314
315
            path = "/" + path;
315
316
        url += path;
316
317
    }
425
426
    {
426
427
        arg = arguments[i];
427
428
        if (arg.length == 0) continue;
428
 
        if (arg[0] == '/')
 
429
        if (arg.charAt(0) == '/')
429
430
            path = arg;
430
431
        else
431
432
        {
432
 
            if (path.length > 0 && path[path.length-1] != '/')
 
433
            if (path.length > 0 && path.charAt(path.length-1) != '/')
433
434
                path += '/';
434
435
            path += arg;
435
436
        }
490
491
function pathlist_to_path(pathlist)
491
492
{
492
493
    ret = path_join.apply(null, pathlist);
493
 
    if (ret[ret.length-1] != '/')
 
494
    if (ret.charAt(ret.length-1) != '/')
494
495
        ret += '/';
495
496
    return ret;
496
497
}
511
512
    return make_path(path_join.apply(null, arguments));
512
513
}
513
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
 
514
523
/** Given a path, gets the "basename" (the last path segment).
515
524
 */
516
525
function path_basename(path)
529
538
    return str.substr(str.length - substring.length) == substring;
530
539
}
531
540
 
532
 
/** Equivalent to Python's repr.
533
 
 * Gets the JavaScript string representation.
534
 
 * Actually just calls JSON.stringify.
535
 
 */
536
 
function repr(str)
537
 
{
538
 
    return JSON.stringify(str);
539
 
}
540
 
 
541
541
/** Removes all occurences of a value from an array.
542
542
 */
543
543
Array.prototype.removeall = function(val)
594
594
    }
595
595
}
596
596
 
597
 
/** Makes an asynchronous XMLHttpRequest call to the server.
 
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.
598
615
 * Sends the XMLHttpRequest object containing the completed response to a
599
616
 * specified callback function.
600
617
 *
601
618
 * \param callback A callback function. Will be called when the response is
602
619
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
603
 
 *      completed response.
 
620
 *      completed response. If callback is null this is a syncronous request 
 
621
 *      otherwise this is an asynchronous request.
604
622
 * \param app IVLE app to call (such as "fileservice").
605
623
 * \param path URL path to make the request to, within the application.
606
624
 * \param args Argument object, as described in parse_url and friends.
618
636
    /* A random string, for multipart/form-data
619
637
     * (This is not checked against anywhere else, it is solely defined and
620
638
     * used within this function) */
621
 
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
 
639
    var boundary = random_string(20);
622
640
    var xhr = new_xmlhttprequest();
623
 
    xhr.onreadystatechange = function()
624
 
        {
625
 
            if (xhr.readyState == 4)
 
641
    var asyncronous = callback != null;
 
642
    if (asyncronous)
 
643
    {
 
644
        xhr.onreadystatechange = function()
626
645
            {
627
 
                callback(xhr);
 
646
                if (xhr.readyState == 4)
 
647
                {
 
648
                    callback(xhr);
 
649
                }
628
650
            }
629
 
        }
 
651
    }
630
652
    if (method == "GET")
631
653
    {
632
654
        /* GET sends the args in the URL */
633
655
        url = build_url({"path": path, "args": args});
634
656
        /* open's 3rd argument = true -> asynchronous */
635
 
        xhr.open(method, url, true);
 
657
        xhr.open(method, url, asyncronous);
636
658
        xhr.send(null);
637
659
    }
638
660
    else
639
661
    {
640
662
        /* POST sends the args in application/x-www-form-urlencoded */
641
663
        url = encodeURI(path);
642
 
        xhr.open(method, url, true);
 
664
        xhr.open(method, url, asyncronous);
643
665
        var message;
644
666
        if (content_type == "multipart/form-data")
645
667
        {
646
668
            xhr.setRequestHeader("Content-Type",
647
 
                "multipart/form-data, boundary=" + boundary);
 
669
                "multipart/form-data; boundary=" + boundary);
648
670
            message = make_multipart_formdata(args, boundary);
649
671
        }
650
672
        else
652
674
            xhr.setRequestHeader("Content-Type", content_type);
653
675
            message = make_query_string(args);
654
676
        }
655
 
        xhr.setRequestHeader("Content-Length", message.length);
656
677
        xhr.send(message);
657
678
    }
 
679
    /* Only return the XHR for syncronous requests */
 
680
    if (!asyncronous)
 
681
    { 
 
682
        return xhr;
 
683
    }
658
684
}
659
685
 
 
686
/** Attempts to JSON decodes a response object
 
687
 * If a non-200 response or the JSON decode fails then returns null
 
688
 */
 
689
function decode_response(response)
 
690
{
 
691
    if (response.status == 200)
 
692
    {
 
693
        try
 
694
        {
 
695
            var responseText = response.responseText;
 
696
            return JSON.parse(responseText);
 
697
        }
 
698
        catch (e)
 
699
        {
 
700
            // Pass
 
701
        }
 
702
     }
 
703
    
 
704
     return null;
 
705
}