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

« back to all changes in this revision

Viewing changes to prototypes/browser/browser.js

  • Committer: mattgiuca
  • Date: 2007-12-06 22:38:46 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:9
Added prototypes directory. Added ajax file browser proof-of-concept demo.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* browser.js
 
2
 * Client-side interaction for both file browser and editor.
 
3
 * PROOF-OF-CONCEPT ONLY
 
4
 *
 
5
 * Author: Matt Giuca
 
6
 */
 
7
 
 
8
var gpathlist;
 
9
 
 
10
/* Removes all children of a given element */
 
11
function removechildren(elem)
 
12
{
 
13
    while (elem.lastChild != null)
 
14
        elem.removeChild(elem.lastChild);
 
15
}
 
16
 
 
17
/* Clears all dynamic data from the page, so it can be refilled. */
 
18
function clearfiles()
 
19
{
 
20
    path = document.getElementById("path");
 
21
    removechildren(path);
 
22
    files = document.getElementById("files");
 
23
    removechildren(files);
 
24
}
 
25
 
 
26
function makebutton(text, action)
 
27
{
 
28
    button = document.createElement("input");
 
29
    button.setAttribute("type", "button");
 
30
    button.setAttribute("value", text);
 
31
    button.setAttribute("onclick", action);
 
32
    return button;
 
33
}
 
34
 
 
35
/* Makes a TD element with text in it */
 
36
function maketd(text)
 
37
{
 
38
    td = document.createElement("td");
 
39
    td.appendChild(document.createTextNode(text));
 
40
    return td;
 
41
}
 
42
 
 
43
function maketdwithlink(text, href, onclick)
 
44
{
 
45
    td = document.createElement("td");
 
46
    link = document.createElement("a");
 
47
    link.setAttribute("href", href);
 
48
    if (onclick != null)
 
49
        link.setAttribute("onclick", onclick);
 
50
    link.appendChild(document.createTextNode(text));
 
51
    td.appendChild(link);
 
52
    return td;
 
53
}
 
54
 
 
55
function maketdwithactions(filename)
 
56
{
 
57
    td = document.createElement("td");
 
58
    td.appendChild(makebutton("Delete", "rm(\"" + filename + "\")"));
 
59
    td.appendChild(makebutton("Rename", "rename(\"" + filename + "\")"));
 
60
    td.appendChild(makebutton("Edit", "edit(\"" + filename + "\")"));
 
61
    return td;
 
62
}
 
63
 
 
64
/* Converts a list of directories into a path name, with a slash at the end */
 
65
function pathlisttopath(pathlist)
 
66
{
 
67
    ret = "";
 
68
    for each (dir in pathlist)
 
69
    {
 
70
        ret += dir + "/";
 
71
    }
 
72
    return ret;
 
73
}
 
74
 
 
75
function presentpath(pathlist)
 
76
{
 
77
    path = document.getElementById("path");
 
78
    gpathlist = pathlist;
 
79
    pathlist = ["home"].concat(pathlist);
 
80
    navlist = [];
 
81
    home = true;
 
82
 
 
83
    /* Create all of the paths */
 
84
    for each (dir in pathlist)
 
85
    {
 
86
        if (home == false)
 
87
            navlist.push(dir);
 
88
        home = false;
 
89
        /* Make an 'a' element */
 
90
        link = document.createElement("a");
 
91
        link.setAttribute("href", "#");
 
92
        link.setAttribute("onclick", "nav(" + JSON.stringify(navlist) + ")");
 
93
        link.appendChild(document.createTextNode(dir));
 
94
        path.appendChild(link);
 
95
        path.appendChild(document.createTextNode("/"));
 
96
    }
 
97
}
 
98
 
 
99
/* Presents a directory listing to the page.
 
100
 * pathlist is an array of strings, the names of the directories in the path.
 
101
 * listing is a list of objects where each object is a file (containing
 
102
 * several fields about the file).
 
103
 */
 
104
function presentlisting(pathlist, listing)
 
105
{
 
106
    presentpath(pathlist);
 
107
    files = document.getElementById("files");
 
108
 
 
109
    /* Create all of the files */
 
110
    for each (file in listing)
 
111
    {
 
112
        /* Make a 'tr' element */
 
113
        row = document.createElement("tr");
 
114
        if (file.isdir)
 
115
        {
 
116
            row.appendChild(maketd("dir"));
 
117
            navlink = JSON.stringify(navlist.concat([file.filename]));
 
118
            navlink = "nav(" + navlink + ")";
 
119
            row.appendChild(maketdwithlink(file.filename, "#", navlink));
 
120
            row.appendChild(maketd(file.size));
 
121
            row.appendChild(maketd(file.mtime));
 
122
            row.appendChild(maketd(""));
 
123
        }
 
124
        else
 
125
        {
 
126
            row.appendChild(maketd("file"));
 
127
            row.appendChild(maketd(file.filename));
 
128
            row.appendChild(maketd(file.size));
 
129
            row.appendChild(maketd(file.mtime));
 
130
            row.appendChild(maketdwithactions(file.filename));
 
131
        }
 
132
        files.appendChild(row);
 
133
    }
 
134
 
 
135
}
 
136
 
 
137
/* AJAX */
 
138
 
 
139
function obj_to_query_string(pagename, obj)
 
140
{
 
141
    var hadone = false;
 
142
    qs = pagename;
 
143
    for (key in obj)
 
144
    {
 
145
        if (hadone == false)
 
146
        {
 
147
            qs += "?";
 
148
            hadone = true;
 
149
        }
 
150
        else
 
151
            qs += "&";
 
152
        qs += escape(key) + "=" + escape(obj[key]);
 
153
    }
 
154
    return qs;
 
155
}
 
156
 
 
157
/* ACTIONS */
 
158
 
 
159
function nav(pathlist)
 
160
{
 
161
    gpathlist = pathlist;
 
162
    refresh();
 
163
}
 
164
 
 
165
function refresh()
 
166
 
167
    path = pathlisttopath(gpathlist);
 
168
    url = obj_to_query_string("files.py/ls", {"path" : path});
 
169
    var xmlhttp =  new XMLHttpRequest();
 
170
        // false -> SYNCHRONOUS (wait for response)
 
171
        // (No need for a callback function)
 
172
    xmlhttp.open("GET", url, false);
 
173
    xmlhttp.send("");
 
174
    listing = JSON.parse(xmlhttp.responseText);
 
175
    if (listing == null)
 
176
        alert("An error occured");
 
177
    else if ("error" in listing)
 
178
        alert("Error: " + listing.error);
 
179
    else
 
180
    {
 
181
        clearfiles();
 
182
        presentlisting(gpathlist, listing);
 
183
    }
 
184
}
 
185
 
 
186
function rm(filename)
 
187
{
 
188
    path = pathlisttopath(gpathlist);
 
189
    url = obj_to_query_string("files.py/rm",
 
190
        {"path" : path, "filename" : filename});
 
191
    var xmlhttp =  new XMLHttpRequest();
 
192
        // false -> SYNCHRONOUS (wait for response)
 
193
        // (No need for a callback function)
 
194
    xmlhttp.open("GET", url, false);
 
195
    xmlhttp.send("");
 
196
    listing = JSON.parse(xmlhttp.responseText);
 
197
    if (listing == null)
 
198
        alert("An error occured");
 
199
    else if ("error" in listing)
 
200
        alert("Error: " + listing.error);
 
201
    else
 
202
    {
 
203
        clearfiles();
 
204
        presentlisting(gpathlist, listing);
 
205
    }
 
206
}
 
207
 
 
208
function rename(fromfilename)
 
209
{
 
210
    tofilename = prompt("Rename file \"" + fromfilename + "\" to?");
 
211
    path = pathlisttopath(gpathlist);
 
212
    url = obj_to_query_string("files.py/rename",
 
213
        {"path" : path, "fromfilename" : fromfilename,
 
214
        "tofilename" : tofilename});
 
215
    var xmlhttp =  new XMLHttpRequest();
 
216
        // false -> SYNCHRONOUS (wait for response)
 
217
        // (No need for a callback function)
 
218
    xmlhttp.open("GET", url, false);
 
219
    xmlhttp.send("");
 
220
    listing = JSON.parse(xmlhttp.responseText);
 
221
    if (listing == null)
 
222
        alert("An error occured");
 
223
    else if ("error" in listing)
 
224
        alert("Error: " + listing.error);
 
225
    else
 
226
    {
 
227
        clearfiles();
 
228
        presentlisting(gpathlist, listing);
 
229
    }
 
230
}
 
231
 
 
232
function newfile()
 
233
{
 
234
    window.location = "edit.html";
 
235
}
 
236
 
 
237
function edit(filename)
 
238
{
 
239
    window.location = "edit.html?filename="
 
240
        + pathlisttopath(gpathlist) + filename;
 
241
}
 
242
 
 
243
function savefile()
 
244
{
 
245
    filename = document.getElementById("filename").value;
 
246
    data = document.getElementById("data").value;
 
247
    url = obj_to_query_string("files.py/putfile",
 
248
        {"path" : "", "filename" : filename, "data" : data});
 
249
    var xmlhttp =  new XMLHttpRequest();
 
250
        // false -> SYNCHRONOUS (wait for response)
 
251
        // (No need for a callback function)
 
252
    xmlhttp.open("GET", url, false);
 
253
    xmlhttp.send("");
 
254
    listing = JSON.parse(xmlhttp.responseText);
 
255
    if (listing == null)
 
256
        alert("An error occured");
 
257
    else if ("error" in listing)
 
258
        alert("Error: " + listing.error);
 
259
}
 
260
 
 
261
function loadfile()
 
262
{
 
263
    filename = document.getElementById("filename").value;
 
264
    if (filename == null || filename == "")
 
265
        return;
 
266
    url = obj_to_query_string("files.py/getfile",
 
267
        {"path" : "", "filename" : filename});
 
268
    var xmlhttp =  new XMLHttpRequest();
 
269
        // false -> SYNCHRONOUS (wait for response)
 
270
        // (No need for a callback function)
 
271
    xmlhttp.open("GET", url, false);
 
272
    xmlhttp.send("");
 
273
    document.getElementById("data").value = xmlhttp.responseText;
 
274
}
 
275
 
 
276
/* Called on page load */
 
277
function init_browser()
 
278
{
 
279
    gpathlist = [];
 
280
    refresh();
 
281
}
 
282
 
 
283
function init_edit()
 
284
{
 
285
    document.getElementById("filename").value = getURLParam("filename");
 
286
    loadfile();
 
287
}
 
288
 
 
289
/* BORROWED CODE */
 
290
 
 
291
/* http://www.11tmr.com/11tmr.nsf/d6plinks/MWHE-695L9Z */
 
292
function getURLParam(strParamName){
 
293
  var strReturn = "";
 
294
  var strHref = window.location.href;
 
295
  if ( strHref.indexOf("?") > -1 ){
 
296
    var strQueryString = strHref.substr(strHref.indexOf("?"));
 
297
    var aQueryString = strQueryString.split("&");
 
298
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
 
299
      if (
 
300
aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ){
 
301
        var aParam = aQueryString[iParam].split("=");
 
302
        strReturn = aParam[1];
 
303
        break;
 
304
      }
 
305
    }
 
306
  }
 
307
  return unescape(strReturn);
 
308
}