]> gitweb @ CieloNegro.org - Rakka.git/blob - js/editPage.js
implemented page deleting
[Rakka.git] / js / editPage.js
1 Rakka.$previewHeader = null;
2 Rakka.$previewArea   = null;
3
4 Rakka.editPage = function (pageName) {
5     var $area = Rakka.switchScreen();
6
7     Rakka.displayWaitingMessage("Loading... please wait.");
8     
9     // XML 版のページを取得する。
10     $.ajax({
11         url    : Rakka.baseURI + pageName + ".xml",
12         success: function (pageXml) {
13             Rakka.hideWaitingMessage();
14             
15             var $page       = $(pageXml).find("page");
16             var oldRevision = $page.attr("revision");
17             var defaultType
18                 = $page.attr("isBinary") == "yes"          ? "binary"
19                 : $page.attr("type")     == "text/x-rakka" ? "rakka"
20                 : $page.attr("type")     == "text/css"     ? "css"
21                 : $page.attr("redirect") != null           ? "redirect"
22                 :                                            "unknown"
23                 ;
24             var source
25                 = $page.attr("redirect") != null ? $page.attr("redirect")
26                 : $page.find("textData").text()
27                 ;
28             Rakka.displayPageEditor(pageName, oldRevision, defaultType, source);
29         },
30         error  : function (req) {
31             Rakka.hideWaitingMessage();
32             
33             if (req.status == 404) {
34                 Rakka.displayPageEditor(pageName, null, "rakka", null);
35             }
36             else {
37                 $area.text("Error: " + req.status + " " + req.statusText);
38             }
39         }
40     });
41 };
42
43 Rakka.newPage = function () {
44     Rakka.displayPageEditor("", null, "rakka", null);
45 };
46
47 Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source) {
48     var $area = Rakka.switchScreen();
49     $area.empty();
50
51     Rakka.$previewHeader = $( $.H1({}, "Preview") );
52     $area.append(Rakka.$previewHeader);
53     Rakka.$previewHeader.hide();
54
55     Rakka.$previewArea = $( $.DIV({className: "preview"}) );
56     $area.append(Rakka.$previewArea);
57     Rakka.$previewArea.hide();
58
59     $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
60     
61     var fldPageName
62         = $.INPUT({type : "text", value: pageName});
63
64     var btnTypeRakka
65         = $.INPUT({type   : "radio",
66                    name   : "type",
67                    checked: (defaultType == "rakka"    ? "checked" : "")});
68
69     var btnTypeCSS
70         = $.INPUT({type   : "radio",
71                    name   : "type",
72                    checked: (defaultType == "css"      ? "checked" : "")});
73
74     var btnTypeBinary
75         = $.INPUT({type   : "radio",
76                    name   : "type",
77                    checked: (defaultType == "binary"   ? "checked" : "")});
78
79     var btnTypeRedirect
80         = $.INPUT({type   : "radio",
81                    name   : "type",
82                    checked: (defaultType == "redirect" ? "checked" : "")});
83
84     var fldRakkaSource
85         = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : ""));
86
87     var fldCSSSource
88         = $.TEXTAREA({}, (defaultType == "css"   && source != null ? source : ""));
89
90     var fldUploadFile
91         = $.INPUT({type: "file"});
92
93     var fldRedirect
94         = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
95
96     var trContent
97         = $.TR({}, 
98                $.TH({}),
99                $.TD({})
100               );
101
102     var btnPreview
103         = $.INPUT({type: "button", value: "Preview page"});
104     
105     $(btnPreview).click(function () {
106         if (btnTypeRakka.checked) {
107             Rakka.previewRakkaPage(
108                 fldPageName.value, fldRakkaSource.value);
109         }
110         else if (btnTypeBinary.checked) {
111             Rakka.previewBinaryPage(
112                 fldPageName.value, fldUploadFile.value);
113         }
114     });
115
116     var btnSubmit
117         = $.INPUT({type: "button", value: "Submit page"});
118     
119     $(btnSubmit).click(function () {
120         if (btnTypeRakka.checked) {
121             Rakka.submitTextPage(
122                 pageName,
123                 oldRevision,
124                 fldPageName.value,
125                 "text/x-rakka",
126                 fldRakkaSource.value);
127         }
128         else if (btnTypeCSS.checked) {
129             Rakka.submitTextPage(
130                 pageName,
131                 oldRevision,
132                 fldPageName.value,
133                 "text/css",
134                 fldCSSSource.value);
135         }
136         else if (btnTypeBinary.checked) {
137             Rakka.submitBinaryPage(
138                 pageName,
139                 oldRevision,
140                 fldPageName.value,
141                 fldUploadFile.value);
142         }
143         else if (btnTypeRedirect.checked) {
144             Rakka.submitRedirection(
145                 pageName,
146                 oldRevision,
147                 fldPageName.value,
148                 fldRedirect.value);
149         }
150     });
151
152     var btnDelete
153         = $.INPUT({type: "button", value: "Delete this page"});
154     
155     $(btnDelete).click(function () {
156         if (window.confirm("Do you really want to delete this page?")) {
157             Rakka.deletePage(pageName);
158         }
159     });
160
161     var updateTRContent = function () {
162         if (btnTypeRakka.checked) {
163             $(trContent).find("th").text("Wiki source");
164             $(trContent).find("td").empty().append(fldRakkaSource);
165             $(btnPreview).show();
166         }
167         else if (btnTypeCSS.checked) {
168             $(trContent).find("th").text("CSS source");
169             $(trContent).find("td").empty().append(fldCSSSource);
170             $(btnPreview).hide();
171         }
172         else if (btnTypeBinary.checked) {
173             $(trContent).find("th").text("File");
174             $(trContent).find("td").empty().append(fldUploadFile);
175             $(btnPreview).show();
176         }
177         else if (btnTypeRedirect.checked) {
178             $(trContent).find("th").text("Destination Page");
179             $(trContent).find("td").empty().append(fldRedirect);
180             $(btnPreview).hide();
181         }
182     };
183     $(btnTypeRakka   ).change(updateTRContent);
184     $(btnTypeCSS     ).change(updateTRContent);
185     $(btnTypeBinary  ).change(updateTRContent);
186     $(btnTypeRedirect).change(updateTRContent);
187     updateTRContent();
188
189     var pageEditor
190         = $.TABLE({className: "pageEditor"},
191                   $.TBODY({},
192                           $.TR({},
193                                $.TH({}, "Page name"),
194                                $.TD({}, fldPageName)
195                               ),
196                           $.TR({},
197                                $.TH({}, "Page type"),
198                                $.TD({},
199                                     $.UL({},
200                                          $.LI({},
201                                               $.LABEL({},
202                                                       btnTypeRakka,
203                                                       "Wiki page"
204                                                      )
205                                              ),
206                                          $.LI({},
207                                               $.LABEL({},
208                                                       btnTypeCSS,
209                                                       "Style sheet"
210                                                      )
211                                              ),
212                                          $.LI({},
213                                               $.LABEL({},
214                                                       btnTypeBinary,
215                                                       "Binary file"
216                                                      )
217                                              ),
218                                          $.LI({},
219                                               $.LABEL({},
220                                                       btnTypeRedirect,
221                                                       "Redirection"
222                                                      )
223                                              )
224                                         )
225                                    )
226                               ),
227                           trContent,
228                           $.TR({},
229                                $.TH({}),
230                                $.TD({}, btnPreview, btnSubmit, btnDelete)
231                               )
232                          )
233                  );
234
235     if (oldRevision == null || oldRevision == 0) {
236         // 削除不可
237         $(btnDelete).hide();
238     }
239
240     $area.append(pageEditor);
241 };
242
243 Rakka.previewRakkaPage = function (pageName, source) {
244     Rakka.displayWaitingMessage("Loading... please wait.");
245     
246     var url = Rakka.baseURI + "render/" + encodeURI(pageName);
247     $.ajax({
248         type       : "POST",
249         url        : url,
250         contentType: "text/x-rakka",
251         data       : source,
252         processData: false,
253         success    : function (resultDoc) {
254             Rakka.hideWaitingMessage();
255             Rakka.showPreview(resultDoc);
256         },
257         error      : function (req) {
258             Rakka.hideWaitingMessage();
259             alert("Error: " + req.status + " " + req.statusText);
260         }
261     });
262 };
263
264 Rakka.previewBinaryPage = function (pageName, path) {
265     Rakka.displayWaitingMessage("Loading... please wait.");
266
267     /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
268     var bin = Rakka.loadLocalBinaryFile(path);
269     var url = Rakka.baseURI + "render/" + encodeURI(pageName);
270     $.ajax({
271         type       : "POST",
272         url        : url,
273         contentType: "application/x-rakka-base64-stream",
274         data       : Rakka.encodeBase64(bin),
275         processData: false,
276         success    : function (resultDoc) {
277             Rakka.hideWaitingMessage();
278             Rakka.showPreview(resultDoc);
279         },
280         error      : function (req) {
281             Rakka.hideWaitingMessage();
282             alert("Error: " + req.status + " " + req.statusText);
283         }
284     });
285 };
286
287 Rakka.showPreview = function (doc) {
288     Rakka.$previewArea.empty();
289     
290     Rakka.$previewHeader.show();
291     Rakka.$previewArea.show();
292     
293     var root  = doc.documentElement;
294     var child = root.firstChild;
295     do {
296         if (child.nodeType == 1) {
297             // 要素だったので複製
298             Rakka.$previewArea.append(child.cloneNode(true));
299         }
300     } while (child = child.nextSibling);
301 };
302
303 Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
304     var doc = document.implementation.createDocument(
305         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
306
307     var page = doc.documentElement;
308
309     if (oldRevision != null) {
310         // ページ書換時
311         var updateInfo = doc.createElement("updateInfo");
312         updateInfo.setAttribute("oldRevision", oldRevision);
313
314         if (pageName != givenPageName) {
315             var move = doc.createElement("move");
316             move.setAttribute("from", pageName);
317             updateInfo.appendChild(move);
318         }
319
320         page.appendChild(updateInfo);
321     }
322
323     page.setAttribute("type", mimeType);
324
325     var textData = doc.createElement("textData");
326     textData.appendChild(
327         doc.createTextNode(text));
328
329     page.appendChild(textData);
330
331     Rakka.displayWaitingMessage("Submitting... please wait.");
332
333     var url = Rakka.baseURI + encodeURI(givenPageName);
334     $.ajax({
335         type       : "PUT",
336         url        : url,
337         contentType: "text/xml",
338         data       : doc,
339         processData: false,
340         success    : function () {
341             window.location.replace(url);
342         },
343         error      : function (req) {
344             Rakka.hideWaitingMessage();
345             
346             var $area = Rakka.switchScreen();
347             $area.text("Error: " + req.status + " " + req.statusText);
348         }
349     });
350 };
351
352 Rakka.submitBinaryPage = function (pageName, oldRevision, givenPageName, path) {
353     var doc = document.implementation.createDocument(
354         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
355
356     var page = doc.documentElement;
357
358     if (oldRevision != null) {
359         // ページ書換時
360         var updateInfo = doc.createElement("updateInfo");
361         updateInfo.setAttribute("oldRevision", oldRevision);
362
363         if (pageName != givenPageName) {
364             var move = doc.createElement("move");
365             move.setAttribute("from", pageName);
366             updateInfo.appendChild(move);
367         }
368
369         page.appendChild(updateInfo);
370     }
371
372     page.setAttribute("type", "");
373
374     var bin = Rakka.loadLocalBinaryFile(path);
375     var b64 = Rakka.encodeBase64(bin);
376
377     var binaryData = doc.createElement("binaryData");
378     binaryData.appendChild(
379         doc.createTextNode(b64));
380
381     page.appendChild(binaryData);
382
383     Rakka.displayWaitingMessage("Submitting... please wait.");
384
385     var url = Rakka.baseURI + encodeURI(givenPageName);
386     $.ajax({
387         type       : "PUT",
388         url        : url,
389         contentType: "text/xml",
390         data       : doc,
391         processData: false,
392         success    : function () {
393             window.location.replace(url);
394         },
395         error      : function (req) {
396             Rakka.hideWaitingMessage();
397             
398             var $area = Rakka.switchScreen();
399             $area.text("Error: " + req.status + " " + req.statusText);
400         }
401     });
402 };
403
404 Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destination) {
405     var doc = document.implementation.createDocument(
406         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
407
408     var page = doc.documentElement;
409
410     if (oldRevision != null) {
411         // ページ書換時
412         var updateInfo = doc.createElement("updateInfo");
413         updateInfo.setAttribute("oldRevision", oldRevision);
414
415         if (pageName != givenPageName) {
416             var move = doc.createElement("move");
417             move.setAttribute("from", pageName);
418             updateInfo.appendChild(move);
419         }
420
421         page.appendChild(updateInfo);
422     }
423
424     page.setAttribute("redirect", destination);
425
426     Rakka.displayWaitingMessage("Submitting... please wait.");
427
428     var url = Rakka.baseURI + encodeURI(givenPageName);
429     $.ajax({
430         type       : "PUT",
431         url        : url,
432         contentType: "text/xml",
433         data       : doc,
434         processData: false,
435         success    : function () {
436             window.location.replace(url);
437         },
438         error      : function (req) {
439             Rakka.hideWaitingMessage();
440             
441             var $area = Rakka.switchScreen();
442             $area.text("Error: " + req.status + " " + req.statusText);
443         }
444     });
445 };
446
447 Rakka.deletePage = function (pageName) {
448     var url = Rakka.baseURI + encodeURI(pageName);
449     $.ajax({
450         type       : "DELETE",
451         url        : url,
452         success    : function () {
453             window.location.replace(url);
454         },
455         error      : function (req) {
456             Rakka.hideWaitingMessage();
457             
458             var $area = Rakka.switchScreen();
459             $area.text("Error: " + req.status + " " + req.statusText);
460         }
461     });
462 };