~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-11 08:44:39 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:188
browser.js: Can now (shakily) handle directory listings. (lots of code!)
Minor changes to HTML, CSS, and util.js.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 * Date: 11/1/2008
21
21
 */
22
22
 
 
23
/* Url names for apps */
 
24
this_app = "files";
 
25
service_app = "fileservice";
 
26
 
23
27
/* Mapping MIME types onto handlers.
24
28
 * "text" : When navigating to a text file, the text editor is opened.
25
29
 * "image" : When navigating to an image, the image is displayed (rather than
70
74
{
71
75
    args.action = action;
72
76
    /* Call the server and perform the action. This mutates the server. */
73
 
    response = ajax_call("fileservice", path, args, "POST", content_type);
 
77
    response = ajax_call(service_app, path, args, "POST", content_type);
74
78
    /* Check for action errors reported by the server, and report them to the
75
79
     * user */
76
80
    error = response.getResponseHeader("X-IVLE-Action-Error");
91
95
function navigate(path)
92
96
{
93
97
    /* Call the server and request the listing. This mutates the server. */
94
 
    response = ajax_call("fileservice", path, null, "GET");
 
98
    response = ajax_call(service_app, path, null, "GET");
95
99
    /* Now read the response and set up the page accordingly */
96
100
    handle_response(path, response);
97
101
}
173
177
    }
174
178
}
175
179
 
 
180
/** Deletes all "dynamic" content on the page.
 
181
 * This returns the page back to the state it is in when the HTML arrives to
 
182
 * the browser, ready for another handler to populate it.
 
183
 */
 
184
function clearpage()
 
185
{
 
186
    /* Note: For now clear just enough to repopulate with a dir listing.
 
187
     * Later, will have to clear more to make way for other handlers.
 
188
     * Possibly have a "full clear" for all handlers, and special
 
189
     * less-violent clearers for each handler if the same handler is going to
 
190
     * be used that was used last time. */
 
191
    dom_removechildren(document.getElementById("path"));
 
192
    dom_removechildren(document.getElementById("files"));
 
193
    dom_removechildren(document.getElementById("sidepanel"));
 
194
}
 
195
 
176
196
/*** HANDLERS for different types of responses (such as dir listing, file,
177
197
 * etc). */
178
198
 
179
199
function handle_error(message)
180
200
{
181
 
    /* TODO: Rather than alert, rebuild the page into a page showing an error
182
 
     * message */
183
 
    alert("Error: " + message.toString() + ".");
 
201
    /* TODO: Find a better place to put this message. */
 
202
    var msg_elem = document.getElementById("path");
 
203
    var txt_elem = dom_make_text_elem("span", "Error: "
 
204
        + message.toString() + ".")
 
205
    txt_elem.setAttribute("class", "error");
 
206
    msg_elem.appendChild(txt_elem)
 
207
}
 
208
 
 
209
/** Presents a path list (address bar inside the page) for clicking.
 
210
 * (Dir listing).
 
211
 */
 
212
function presentpath(path)
 
213
{
 
214
    var dom_path = document.getElementById("path");
 
215
    var navlist = [];
 
216
    var href_path = make_path(this_app);
 
217
 
 
218
    /* Create all of the paths */
 
219
    for each (dir in path.split("/"))
 
220
    {
 
221
        if (dir == "") continue;
 
222
        navlist.push(dir);
 
223
        /* Make an 'a' element */
 
224
        href_path = path_join(href_path, dir);
 
225
        var link = dom_make_link_elem("a", dir, href_path,
 
226
                "navigate(" + href_path + ")");
 
227
        dom_path.appendChild(link);
 
228
        dom_path.appendChild(document.createTextNode("/"));
 
229
    }
184
230
}
185
231
 
186
232
/** Presents the directory listing.
187
233
 */
188
234
function handle_dir_listing(path, listing)
189
235
{
190
 
    /* TODO */
191
 
    alert(listing);
 
236
    var row_toggle = 1;
 
237
    presentpath(path);
 
238
    /* Nav through the top-level of the JSON to the actual listing object. */
 
239
    var listing = listing.listing;
 
240
 
 
241
    /* Get "." out, it's special */
 
242
    var thisdir = listing["."];
 
243
    delete listing["."];
 
244
    /* Is this dir under svn? */
 
245
    var under_subversion = "svnstatus" in thisdir;
 
246
 
 
247
    var files = document.getElementById("files");
 
248
    var file;
 
249
    var row;
 
250
    var td;
 
251
    var checkbox;
 
252
 
 
253
    /* Create all of the files */
 
254
    for (var filename in listing)
 
255
    {
 
256
        file = listing[filename];
 
257
        /* Make a 'tr' element */
 
258
        row = document.createElement("tr");
 
259
        /* Column 1: Selection checkbox */
 
260
        row.setAttribute("class", "row" + row_toggle.toString())
 
261
        row_toggle = row_toggle == 1 ? 2 : 1;
 
262
        td = document.createElement("td");
 
263
        checkbox = document.createElement("input");
 
264
        checkbox.setAttribute("type", "checkbox");
 
265
        checkbox.setAttribute("title", "Select this file");
 
266
        td.appendChild(checkbox);
 
267
        row.appendChild(td);
 
268
        if (file.isdir)
 
269
        {
 
270
            /* Column 2: Filetype and subversion icons. */
 
271
            td = document.createElement("td");
 
272
            td.setAttribute("class", "thincol");
 
273
            td.appendChild(document.createTextNode("dir"));
 
274
            row.appendChild(td);
 
275
            td = document.createElement("td");
 
276
            td.setAttribute("class", "thincol");
 
277
            if (under_subversion)
 
278
                td.appendChild(document.createTextNode(file.svnstatus));
 
279
            row.appendChild(td);
 
280
            /* Column 3: Filename */
 
281
            row.appendChild(dom_make_link_elem("td", filename,
 
282
                make_path(path_join(this_app, path, filename)),
 
283
                "navigate(" + path_join(path, filename) + ")"));
 
284
        }
 
285
        else
 
286
        {
 
287
            /* Column 2: Filetype and subversion icons. */
 
288
            td = document.createElement("td");
 
289
            td.setAttribute("class", "thincol");
 
290
            td.appendChild(document.createTextNode(file.type));
 
291
            row.appendChild(td);
 
292
            td = document.createElement("td");
 
293
            td.setAttribute("class", "thincol");
 
294
            if (under_subversion)
 
295
                td.appendChild(document.createTextNode(file.svnstatus));
 
296
            row.appendChild(td);
 
297
            /* Column 3: Filename */
 
298
            row.appendChild(dom_make_text_elem("td", filename));
 
299
        }
 
300
        /* Column 4: Size */
 
301
        row.appendChild(dom_make_text_elem("td", nice_filesize(file.size)));
 
302
        /* Column 4: Date */
 
303
        row.appendChild(dom_make_text_elem("td", file.mtime_nice));
 
304
        files.appendChild(row);
 
305
    }
 
306
 
192
307
}
193
308
 
194
309
/** Presents the text editor.
211
326
 */
212
327
window.onload = function()
213
328
{
 
329
    /* Navigate (internally) to the path in the URL bar.
 
330
     * This causes the page to be populated with whatever is at that address,
 
331
     * whether it be a directory or a file.
 
332
     */
 
333
    var path = parse_url(window.location.href).path;
 
334
    /* Strip out root_dir + "/files" from the front of the path */
 
335
    strip_chars = make_path(this_app).length + 1;
 
336
    path = path.substr(strip_chars);
 
337
 
 
338
    navigate(path);
214
339
}