]> gitweb @ CieloNegro.org - Rakka.git/blob - js/editPage.js
implemented previewer
[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         throw new Error("FIXME: not implemented yet");
157     });
158
159     var updateTRContent = function () {
160         if (btnTypeRakka.checked) {
161             $(trContent).find("th").text("Wiki source");
162             $(trContent).find("td").empty().append(fldRakkaSource);
163             $(btnPreview).show();
164         }
165         else if (btnTypeCSS.checked) {
166             $(trContent).find("th").text("CSS source");
167             $(trContent).find("td").empty().append(fldCSSSource);
168             $(btnPreview).hide();
169         }
170         else if (btnTypeBinary.checked) {
171             $(trContent).find("th").text("File");
172             $(trContent).find("td").empty().append(fldUploadFile);
173             $(btnPreview).show();
174         }
175         else if (btnTypeRedirect.checked) {
176             $(trContent).find("th").text("Destination Page");
177             $(trContent).find("td").empty().append(fldRedirect);
178             $(btnPreview).hide();
179         }
180     };
181     $(btnTypeRakka   ).change(updateTRContent);
182     $(btnTypeCSS     ).change(updateTRContent);
183     $(btnTypeBinary  ).change(updateTRContent);
184     $(btnTypeRedirect).change(updateTRContent);
185     updateTRContent();
186
187     var pageEditor
188         = $.TABLE({className: "pageEditor"},
189                   $.TBODY({},
190                           $.TR({},
191                                $.TH({}, "Page name"),
192                                $.TD({}, fldPageName)
193                               ),
194                           $.TR({},
195                                $.TH({}, "Page type"),
196                                $.TD({},
197                                     $.UL({},
198                                          $.LI({},
199                                               $.LABEL({},
200                                                       btnTypeRakka,
201                                                       "Wiki page"
202                                                      )
203                                              ),
204                                          $.LI({},
205                                               $.LABEL({},
206                                                       btnTypeCSS,
207                                                       "Style sheet"
208                                                      )
209                                              ),
210                                          $.LI({},
211                                               $.LABEL({},
212                                                       btnTypeBinary,
213                                                       "Binary file"
214                                                      )
215                                              ),
216                                          $.LI({},
217                                               $.LABEL({},
218                                                       btnTypeRedirect,
219                                                       "Redirection"
220                                                      )
221                                              )
222                                         )
223                                    )
224                               ),
225                           trContent,
226                           $.TR({},
227                                $.TH({}),
228                                $.TD({}, btnPreview, btnSubmit, btnDelete)
229                               )
230                          )
231                  );
232
233     if (oldRevision == null || oldRevision == 0) {
234         // 削除不可
235         $(btnDelete).hide();
236     }
237
238     $area.append(pageEditor);
239 };
240
241 Rakka.previewRakkaPage = function (pageName, source) {
242     Rakka.displayWaitingMessage("Loading... please wait.");
243     
244     var url = Rakka.baseURI + "render/" + encodeURI(pageName);
245     $.ajax({
246         type       : "POST",
247         url        : url,
248         contentType: "text/x-rakka",
249         data       : source,
250         processData: false,
251         success    : function (resultDoc) {
252             Rakka.hideWaitingMessage();
253             Rakka.showPreview(resultDoc);
254         },
255         error      : function (req) {
256             alert("Error: " + req.status + " " + req.statusText);
257         }
258     });
259 };
260
261 Rakka.showPreview = function (doc) {
262     Rakka.$previewArea.empty();
263     
264     Rakka.$previewHeader.show();
265     Rakka.$previewArea.show();
266     
267     var root  = doc.documentElement;
268     var child = root.firstChild;
269     do {
270         if (child.nodeType == 1) {
271             // 要素だったので複製
272             Rakka.$previewArea.append(child.cloneNode(true));
273         }
274     } while (child = child.nextSibling);
275 };
276
277 Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
278     var doc = document.implementation.createDocument(
279         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
280
281     var page = doc.documentElement;
282
283     if (oldRevision != null) {
284         // ページ書換時
285         var updateInfo = doc.createElement("updateInfo");
286         updateInfo.setAttribute("oldRevision", oldRevision);
287
288         if (pageName != givenPageName) {
289             var move = doc.createElement("move");
290             move.setAttribute("from", pageName);
291             updateInfo.appendChild(move);
292         }
293
294         page.appendChild(updateInfo);
295     }
296
297     page.setAttribute("type", mimeType);
298
299     var textData = doc.createElement("textData");
300     textData.appendChild(
301         doc.createTextNode(text));
302
303     page.appendChild(textData);
304
305     Rakka.displayWaitingMessage("Submitting... please wait.");
306
307     var url = Rakka.baseURI + encodeURI(givenPageName);
308     $.ajax({
309         type       : "PUT",
310         url        : url,
311         contentType: "text/xml",
312         data       : doc,
313         processData: false,
314         success    : function () {
315             window.location.replace(url);
316         },
317         error      : function (req) {
318             Rakka.hideWaitingMessage();
319             
320             var $area = Rakka.switchScreen();
321             $area.text("Error: " + req.status + " " + req.statusText);
322         }
323     });
324 };
325
326 Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destination) {
327     var doc = document.implementation.createDocument(
328         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
329
330     var page = doc.documentElement;
331
332     if (oldRevision != null) {
333         // ページ書換時
334         var updateInfo = doc.createElement("updateInfo");
335         updateInfo.setAttribute("oldRevision", oldRevision);
336
337         if (pageName != givenPageName) {
338             var move = doc.createElement("move");
339             move.setAttribute("from", pageName);
340             updateInfo.appendChild(move);
341         }
342
343         page.appendChild(updateInfo);
344     }
345
346     page.setAttribute("redirect", destination);
347
348     Rakka.displayWaitingMessage("Submitting... please wait.");
349
350     var url = Rakka.baseURI + encodeURI(givenPageName);
351     $.ajax({
352         type       : "PUT",
353         url        : url,
354         contentType: "text/xml",
355         data       : doc,
356         processData: false,
357         success    : function () {
358             window.location.replace(url);
359         },
360         error      : function (req) {
361             Rakka.hideWaitingMessage();
362             
363             var $area = Rakka.switchScreen();
364             $area.text("Error: " + req.status + " " + req.statusText);
365         }
366     });
367 };