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