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

« back to all changes in this revision

Viewing changes to www/media/browser/browser.js

  • Committer: mattgiuca
  • Date: 2008-01-13 10:24:53 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:208
dispatch.html, ivle.css: "apptabs" is now an ID, not a class.
    This is so JavaScript code can easily identify it.
editor: Replaced dummy stub with a simple call to browser.handle.
    Editor and File Browser are now integrated with each other.
util.js: New functions, endswith and path_basename.
browser.js: Major changes to accomodate merging editor with file browser.
    Now detects "edit" URLs and handles files slightly-differently.
    In "edit mode", all files are edited even if they are binary.
    There is a warning for editing files that are binary files.
    Changes the styling of the tabs so that the "selected" tab is
    either the file browser or editor depending on whether the editor
    panel is open or not. (So the actual contents of the page determine
    which tab is selected, not the URL or the server).
    Sets the window title to the name of the directory or file being browsed.`

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
/* Url names for apps */
24
24
this_app = "files";
 
25
edit_app = "edit";
25
26
service_app = "fileservice";
26
27
serve_app = "serve";
27
28
download_app = "download";
116
117
 * Called "navigate", can also be used for a simple refresh.
117
118
 * Always makes a GET request.
118
119
 * No return value.
 
120
 * \param editmode Optional boolean. If true, then the user navigated here
 
121
 * with an "edit" URL so we should favour using the editor.
119
122
 */
120
 
function navigate(path)
 
123
function navigate(path, editmode)
121
124
{
122
125
    /* Call the server and request the listing. This mutates the server. */
123
126
    response = ajax_call(service_app, path, null, "GET");
124
127
    /* Now read the response and set up the page accordingly */
125
 
    handle_response(path, response);
 
128
    handle_response(path, response, editmode);
126
129
}
127
130
 
128
131
/** Given an HTTP response object, cleans up and rebuilds the contents of the
135
138
 * things) be used to update the URL in the location bar.
136
139
 * \param response XMLHttpRequest object returned by the server. Should
137
140
 * contain all the response data.
 
141
 * \param editmode Optional boolean. If true, then the user navigated here
 
142
 * with an "edit" URL so we should favour using the editor.
138
143
 */
139
 
function handle_response(path, response)
 
144
function handle_response(path, response, editmode)
140
145
{
141
146
    /* TODO: Set location bar to "path" */
 
147
    settitle(path);
142
148
 
143
149
    /* Clear away the existing page contents */
144
150
    clearpage();
186
192
                handler_type != "audio")
187
193
                handler_type = "binary";
188
194
        }
 
195
        /* If we're in "edit mode", always treat this file as text */
 
196
        would_be_handler_type = handler_type;
 
197
        if (editmode) handler_type = "text";
189
198
        /* handler_type should now be set to either
190
199
         * "text", "image", "audio" or "binary". */
191
200
        switch (handler_type)
192
201
        {
193
202
        case "text":
194
 
            handle_text(path, response.responseText);
 
203
            handle_text(path, response.responseText, would_be_handler_type);
195
204
            break;
196
205
        case "image":
197
206
            /* TODO: Custom image handler */
231
240
    dom_removechildren(document.getElementById("sidepanel"));
232
241
}
233
242
 
 
243
/** Sets the mode to either "file browser" or "text editor" mode.
 
244
 * This modifies the window icon, and selected tab.
 
245
 * \param editmode If True, editor mode. Else, file browser mode.
 
246
 */
 
247
function setmode(editmode)
 
248
{
 
249
    /* Find the DOM elements for the file browser and editor tabs */
 
250
    var tabs = document.getElementById("apptabs");
 
251
    var tab_files = null;
 
252
    var tab_edit = null;
 
253
    var a;
 
254
    var href;
 
255
    for (var i=0; i<tabs.childNodes.length; i++)
 
256
    {
 
257
        /* Find the href of the link within */
 
258
        if (!tabs.childNodes[i].getElementsByTagName) continue;
 
259
        a = tabs.childNodes[i].getElementsByTagName("a");
 
260
        if (a.length == 0) continue;
 
261
        href = a[0].getAttribute("href");
 
262
        if (href == null) continue;
 
263
        if (endswith(href, this_app))
 
264
            tab_files = tabs.childNodes[i];
 
265
        else if (endswith(href, edit_app))
 
266
            tab_edit = tabs.childNodes[i];
 
267
    }
 
268
 
 
269
    if (editmode)
 
270
    {
 
271
        tab_files.removeAttribute("class");
 
272
        tab_edit.setAttribute("class", "thisapp");
 
273
    }
 
274
    else
 
275
    {
 
276
        tab_edit.removeAttribute("class");
 
277
        tab_files.setAttribute("class", "thisapp");
 
278
    }
 
279
}
 
280
 
 
281
function settitle(path)
 
282
{
 
283
    document.title = path_basename(path) + " - IVLE";
 
284
}
 
285
 
234
286
/*** HANDLERS for different types of responses (such as dir listing, file,
235
287
 * etc). */
236
288
 
237
289
function handle_error(message)
238
290
{
 
291
    setmode(false);
239
292
    var files = document.getElementById("filesbody");
240
293
    var txt_elem = dom_make_text_elem("div", "Error: "
241
294
        + message.toString() + ".")
252
305
    var nav_path = "";
253
306
 
254
307
    /* Create all of the paths */
255
 
    for each (dir in path.split("/"))
 
308
    for each (var dir in path.split("/"))
256
309
    {
257
310
        if (dir == "") continue;
258
311
        /* Make an 'a' element */
372
425
 */
373
426
function handle_dir_listing(path, listing)
374
427
{
 
428
    setmode(false);
375
429
    setup_for_dir_listing();
376
430
    var row_toggle = 1;
377
431
    /* Nav through the top-level of the JSON to the actual listing object. */
465
519
 
466
520
/** Presents the text editor.
467
521
 */
468
 
function handle_text(path, text)
 
522
function handle_text(path, text, handler_type)
469
523
{
470
524
    /* Create a textarea with the text in it
471
525
     * (The makings of a primitive editor).
472
526
     */
 
527
 
 
528
    setmode(true);
473
529
    var files = document.getElementById("filesbody");
474
530
    var div = document.createElement("div");
475
531
    files.appendChild(div);
476
532
    div.setAttribute("class", "padding");
 
533
    /* First, print a warning message if this is not actually a text file.
 
534
     */
 
535
    if (handler_type != "text")
 
536
    {
 
537
        var warn = dom_make_text_elem("p",
 
538
            "Warning: You are editing a binary " +
 
539
            "file, which explains any strange characters you may see. If " +
 
540
            "you save this file, you could corrupt it.");
 
541
        div.appendChild(warn);
 
542
    }
477
543
    var txt_elem = dom_make_text_elem("textarea",
478
544
        text.toString())
479
545
    div.appendChild(txt_elem);
486
552
 */
487
553
function handle_binary(path)
488
554
{
489
 
 
 
555
    setmode(false);
490
556
    var files = document.getElementById("filesbody");
491
557
    var div = document.createElement("div");
492
558
    files.appendChild(div);
511
577
     */
512
578
    var path = parse_url(window.location.href).path;
513
579
    /* Strip out root_dir + "/files" from the front of the path */
514
 
    strip_chars = make_path(this_app).length + 1;
515
 
    path = path.substr(strip_chars);
 
580
    var strip = make_path(this_app);
 
581
    var editmode = false;
 
582
    if (path.substr(0, strip.length) == strip)
 
583
        path = path.substr(strip.length+1);
 
584
    else
 
585
    {
 
586
        /* See if this is an edit path */
 
587
        strip = make_path(edit_app);
 
588
        if (path.substr(0, strip.length) == strip)
 
589
        {
 
590
            path = path.substr(strip.length+1);
 
591
            editmode = true;
 
592
        }
 
593
    }
516
594
 
517
595
    if (path.length == 0)
518
596
    {
521
599
        path = username;
522
600
    }
523
601
 
524
 
    navigate(path);
 
602
    navigate(path, editmode);
525
603
}