~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-01-19 22:56:46 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1170
This commit fixes issue #10 and part of issue #9

There are now two options for moving files with their
svn history intact; svn move and svn copy. These
use the svn commands to move the files, allowing students
to move and rename files without their histories being
lost.

This commit also shows the svn status of a dir, if it is
the 'head' of an svn repository.

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
    }
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.
391
426
    {
392
427
        arg = arguments[i];
393
428
        if (arg.length == 0) continue;
394
 
        if (arg[0] == '/')
 
429
        if (arg.charAt(0) == '/')
395
430
            path = arg;
396
431
        else
397
432
        {
398
 
            if (path.length > 0 && path[path.length-1] != '/')
 
433
            if (path.length > 0 && path.charAt(path.length-1) != '/')
399
434
                path += '/';
400
435
            path += arg;
401
436
        }
456
491
function pathlist_to_path(pathlist)
457
492
{
458
493
    ret = path_join.apply(null, pathlist);
459
 
    if (ret[ret.length-1] != '/')
 
494
    if (ret.charAt(ret.length-1) != '/')
460
495
        ret += '/';
461
496
    return ret;
462
497
}
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)
495
538
    return str.substr(str.length - substring.length) == substring;
496
539
}
497
540
 
498
 
/** Equivalent to Python's repr.
499
 
 * Gets the JavaScript string representation.
500
 
 * Actually just calls JSON.stringify.
501
 
 */
502
 
function repr(str)
503
 
{
504
 
    return JSON.stringify(str);
505
 
}
506
 
 
507
541
/** Removes all occurences of a value from an array.
508
542
 */
509
543
Array.prototype.removeall = function(val)
519
553
    arr.splice(j, i-j);
520
554
}
521
555
 
 
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
 
522
565
/** Returns a new XMLHttpRequest object, in a somewhat browser-agnostic
523
566
 * fashion.
524
567
 */
551
594
    }
552
595
}
553
596
 
554
 
/** 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.
555
615
 * Sends the XMLHttpRequest object containing the completed response to a
556
616
 * specified callback function.
557
617
 *
558
618
 * \param callback A callback function. Will be called when the response is
559
619
 *      complete. Passed 1 parameter, an XMLHttpRequest object containing the
560
 
 *      completed response.
 
620
 *      completed response. If callback is null this is a syncronous request 
 
621
 *      otherwise this is an asynchronous request.
561
622
 * \param app IVLE app to call (such as "fileservice").
562
623
 * \param path URL path to make the request to, within the application.
563
624
 * \param args Argument object, as described in parse_url and friends.
575
636
    /* A random string, for multipart/form-data
576
637
     * (This is not checked against anywhere else, it is solely defined and
577
638
     * used within this function) */
578
 
    var boundary = "48234n334nu7n4n2ynonjn234t683jyh80j";
 
639
    var boundary = random_string(20);
579
640
    var xhr = new_xmlhttprequest();
580
 
    xhr.onreadystatechange = function()
581
 
        {
582
 
            if (xhr.readyState == 4)
 
641
    var asyncronous = callback != null;
 
642
    if (asyncronous)
 
643
    {
 
644
        xhr.onreadystatechange = function()
583
645
            {
584
 
                callback(xhr);
 
646
                if (xhr.readyState == 4)
 
647
                {
 
648
                    callback(xhr);
 
649
                }
585
650
            }
586
 
        }
 
651
    }
587
652
    if (method == "GET")
588
653
    {
589
654
        /* GET sends the args in the URL */
590
655
        url = build_url({"path": path, "args": args});
591
656
        /* open's 3rd argument = true -> asynchronous */
592
 
        xhr.open(method, url, true);
 
657
        xhr.open(method, url, asyncronous);
593
658
        xhr.send(null);
594
659
    }
595
660
    else
596
661
    {
597
662
        /* POST sends the args in application/x-www-form-urlencoded */
598
663
        url = encodeURI(path);
599
 
        xhr.open(method, url, true);
 
664
        xhr.open(method, url, asyncronous);
600
665
        var message;
601
666
        if (content_type == "multipart/form-data")
602
667
        {
603
668
            xhr.setRequestHeader("Content-Type",
604
 
                "multipart/form-data, boundary=" + boundary);
 
669
                "multipart/form-data; boundary=" + boundary);
605
670
            message = make_multipart_formdata(args, boundary);
606
671
        }
607
672
        else
609
674
            xhr.setRequestHeader("Content-Type", content_type);
610
675
            message = make_query_string(args);
611
676
        }
612
 
        xhr.setRequestHeader("Content-Length", message.length);
613
677
        xhr.send(message);
614
678
    }
 
679
    /* Only return the XHR for syncronous requests */
 
680
    if (!asyncronous)
 
681
    { 
 
682
        return xhr;
 
683
    }
615
684
}
616
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
}