]> gitweb @ CieloNegro.org - Rakka.git/blob - js/editPage.js
more improvements related to redirection
[Rakka.git] / js / editPage.js
1 Rakka.editPage = function (baseURI, pageName) {
2     var $area = Rakka.switchScreen();
3
4     Rakka.displayWaitingMessage("Loading... please wait.");
5     
6     // XML 版のページを取得する。
7     $.ajax({
8         url    : baseURI + pageName + ".xml",
9         success: function (pageXml) {
10             Rakka.hideWaitingMessage();
11             
12             var $page       = $(pageXml).find("page");
13             var oldRevision = $page.attr("revision");
14             var defaultType
15                 = $page.attr("isBinary") == "yes"          ? "binary"
16                 : $page.attr("type")     == "text/x-rakka" ? "rakka"
17                 : $page.attr("type")     == "text/css"     ? "css"
18                 : $page.attr("redirect") != null           ? "redirect"
19                 :                                            "unknown"
20                 ;
21             var source
22                 = $page.attr("redirect") != null ? $page.attr("redirect")
23                 : $page.find("textData").text()
24                 ;
25             Rakka.displayPageEditor(baseURI, pageName, oldRevision, defaultType, source);
26         },
27         error  : function (req) {
28             Rakka.hideWaitingMessage();
29             
30             if (req.status == 404) {
31                 Rakka.displayPageEditor(baseURI, pageName, null, "rakka", null);
32             }
33             else {
34                 $area.text("Error: " + req.status + " " + req.statusText);
35             }
36         }
37     });
38 };
39
40 Rakka.newPage = function (baseURI) {
41     Rakka.displayPageEditor(baseURI, "", null, "rakka", null);
42 };
43
44 Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, source) {
45     var $area = Rakka.switchScreen();
46     $area.empty();
47
48     $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
49
50     var fldPageName
51         = $.INPUT({type : "text", value: pageName});
52
53     var btnTypeRakka
54         = $.INPUT({type   : "radio",
55                    name   : "type",
56                    checked: (defaultType == "rakka"    ? "checked" : "")});
57
58     var btnTypeCSS
59         = $.INPUT({type   : "radio",
60                    name   : "type",
61                    checked: (defaultType == "css"      ? "checked" : "")});
62
63     var btnTypeBinary
64         = $.INPUT({type   : "radio",
65                    name   : "type",
66                    checked: (defaultType == "binary"   ? "checked" : "")});
67
68     var btnTypeRedirect
69         = $.INPUT({type   : "radio",
70                    name   : "type",
71                    checked: (defaultType == "redirect" ? "checked" : "")});
72
73     var fldRakkaSource
74         = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : ""));
75
76     var fldCSSSource
77         = $.TEXTAREA({}, (defaultType == "css"   && source != null ? source : ""));
78
79     var fldUploadFile
80         = $.INPUT({type: "file"});
81
82     var fldRedirect
83         = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
84
85     var trContent
86         = $.TR({}, 
87                $.TH({}),
88                $.TD({})
89               );
90
91     var btnPreview
92         = $.INPUT({type: "button", value: "Preview page"});
93     
94     $(btnPreview).click(function () {
95         throw new Error("FIXME: not implemented yet");
96     });
97
98     var btnSubmit
99         = $.INPUT({type: "button", value: "Submit page"});
100     
101     $(btnSubmit).click(function () {
102         if (btnTypeRakka.checked) {
103             Rakka.submitTextPage(
104                 baseURI,
105                 pageName,
106                 oldRevision,
107                 fldPageName.value,
108                 "text/x-rakka",
109                 fldRakkaSource.value);
110         }
111         else if (btnTypeCSS.checked) {
112             Rakka.submitTextPage(
113                 baseURI,
114                 pageName,
115                 oldRevision,
116                 fldPageName.value,
117                 "text/css",
118                 fldCSSSource.value);
119         }
120         else if (btnTypeBinary.checked) {
121             Rakka.submitBinaryPage(
122                 baseURI,
123                 pageName,
124                 oldRevision,
125                 fldPageName.value,
126                 fldUploadFile.value);
127         }
128         else if (btnTypeRedirect.checked) {
129             Rakka.submitRedirection(
130                 baseURI,
131                 pageName,
132                 oldRevision,
133                 fldPageName.value,
134                 fldRedirect.value);
135         }
136     });
137
138     var btnDelete
139         = $.INPUT({type: "button", value: "Delete this page"});
140     
141     $(btnDelete).click(function () {
142         throw new Error("FIXME: not implemented yet");
143     });
144
145     var updateTRContent = function () {
146         if (btnTypeRakka.checked) {
147             $(trContent).find("th").text("Wiki source");
148             $(trContent).find("td").empty().append(fldRakkaSource);
149             $(btnPreview).show();
150         }
151         else if (btnTypeCSS.checked) {
152             $(trContent).find("th").text("CSS source");
153             $(trContent).find("td").empty().append(fldCSSSource);
154             $(btnPreview).hide();
155         }
156         else if (btnTypeBinary.checked) {
157             $(trContent).find("th").text("File");
158             $(trContent).find("td").empty().append(fldUploadFile);
159             $(btnPreview).show();
160         }
161         else if (btnTypeRedirect.checked) {
162             $(trContent).find("th").text("Destination Page");
163             $(trContent).find("td").empty().append(fldRedirect);
164             $(btnPreview).hide();
165         }
166     };
167     $(btnTypeRakka   ).change(updateTRContent);
168     $(btnTypeCSS     ).change(updateTRContent);
169     $(btnTypeBinary  ).change(updateTRContent);
170     $(btnTypeRedirect).change(updateTRContent);
171     updateTRContent();
172
173     var pageEditor
174         = $.TABLE({className: "pageEditor"},
175                   $.TBODY({},
176                           $.TR({},
177                                $.TH({}, "Page name"),
178                                $.TD({}, fldPageName)
179                               ),
180                           $.TR({},
181                                $.TH({}, "Page type"),
182                                $.TD({},
183                                     $.UL({},
184                                          $.LI({},
185                                               $.LABEL({},
186                                                       btnTypeRakka,
187                                                       "Wiki page"
188                                                      )
189                                              ),
190                                          $.LI({},
191                                               $.LABEL({},
192                                                       btnTypeCSS,
193                                                       "Style sheet"
194                                                      )
195                                              ),
196                                          $.LI({},
197                                               $.LABEL({},
198                                                       btnTypeBinary,
199                                                       "Binary file"
200                                                      )
201                                              ),
202                                          $.LI({},
203                                               $.LABEL({},
204                                                       btnTypeRedirect,
205                                                       "Redirection"
206                                                      )
207                                              )
208                                         )
209                                    )
210                               ),
211                           trContent,
212                           $.TR({},
213                                $.TH({}),
214                                $.TD({}, btnPreview, btnSubmit, btnDelete)
215                               )
216                          )
217                  );
218
219     if (oldRevision == null || oldRevision == 0) {
220         // 削除不可
221         $(btnDelete).hide();
222     }
223
224     $area.append(pageEditor);
225 };
226
227 Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName, mimeType, text) {
228     var doc = document.implementation.createDocument(
229         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
230
231     var page = doc.documentElement;
232
233     if (oldRevision != null) {
234         // ページ書換時
235         var updateInfo = doc.createElement("updateInfo");
236         updateInfo.setAttribute("oldRevision", oldRevision);
237
238         if (pageName != givenPageName) {
239             var move = doc.createElement("move");
240             move.setAttribute("from", pageName);
241             updateInfo.appendChild(move);
242         }
243
244         page.appendChild(updateInfo);
245     }
246
247     page.setAttribute("type", mimeType);
248
249     var textData = doc.createElement("textData");
250     textData.appendChild(
251         doc.createTextNode(text));
252
253     page.appendChild(textData);
254
255     Rakka.displayWaitingMessage("Submitting... please wait.");
256
257     var url = baseURI + encodeURI(givenPageName);
258     $.ajax({
259         type       : "PUT",
260         url        : url,
261         contentType: "text/xml",
262         data       : doc,
263         processData: false,
264         success    : function () {
265             window.location.replace(url);
266         },
267         error      : function (req) {
268             Rakka.hideWaitingMessage();
269             
270             var $area = Rakka.switchScreen();
271             $area.text("Error: " + req.status + " " + req.statusText);
272         }
273     });
274 };
275
276 Rakka.submitRedirection = function (baseURI, pageName, oldRevision, givenPageName, destination) {
277     var doc = document.implementation.createDocument(
278         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
279
280     var page = doc.documentElement;
281
282     if (oldRevision != null) {
283         // ページ書換時
284         var updateInfo = doc.createElement("updateInfo");
285         updateInfo.setAttribute("oldRevision", oldRevision);
286
287         if (pageName != givenPageName) {
288             var move = doc.createElement("move");
289             move.setAttribute("from", pageName);
290             updateInfo.appendChild(move);
291         }
292
293         page.appendChild(updateInfo);
294     }
295
296     page.setAttribute("redirect", destination);
297
298     Rakka.displayWaitingMessage("Submitting... please wait.");
299
300     var url = baseURI + encodeURI(givenPageName);
301     $.ajax({
302         type       : "PUT",
303         url        : url,
304         contentType: "text/xml",
305         data       : doc,
306         processData: false,
307         success    : function () {
308             window.location.replace(url);
309         },
310         error      : function (req) {
311             Rakka.hideWaitingMessage();
312             
313             var $area = Rakka.switchScreen();
314             $area.text("Error: " + req.status + " " + req.statusText);
315         }
316     });
317 };