]> gitweb @ CieloNegro.org - Rakka.git/blob - js/editPage.js
4623849dec6e35fde133d2e10be86ec79d962854
[Rakka.git] / js / editPage.js
1 Rakka.editPage = function (pageName) {
2     var $area = Rakka.switchScreen();
3
4     Rakka.displayWaitingMessage("Loading... please wait.");
5     
6     // XML 版のページを取得する。
7     $.ajax({
8         url    : Rakka.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(pageName, oldRevision, defaultType, source);
26         },
27         error  : function (req) {
28             Rakka.hideWaitingMessage();
29             
30             if (req.status == 404) {
31                 Rakka.displayPageEditor(pageName, null, "rakka", null);
32             }
33             else {
34                 $area.text("Error: " + req.status + " " + req.statusText);
35             }
36         }
37     });
38 };
39
40 Rakka.newPage = function () {
41     Rakka.displayPageEditor("", null, "rakka", null);
42 };
43
44 Rakka.displayPageEditor = function (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                 pageName,
105                 oldRevision,
106                 fldPageName.value,
107                 "text/x-rakka",
108                 fldRakkaSource.value);
109         }
110         else if (btnTypeCSS.checked) {
111             Rakka.submitTextPage(
112                 pageName,
113                 oldRevision,
114                 fldPageName.value,
115                 "text/css",
116                 fldCSSSource.value);
117         }
118         else if (btnTypeBinary.checked) {
119             Rakka.submitBinaryPage(
120                 pageName,
121                 oldRevision,
122                 fldPageName.value,
123                 fldUploadFile.value);
124         }
125         else if (btnTypeRedirect.checked) {
126             Rakka.submitRedirection(
127                 pageName,
128                 oldRevision,
129                 fldPageName.value,
130                 fldRedirect.value);
131         }
132     });
133
134     var btnDelete
135         = $.INPUT({type: "button", value: "Delete this page"});
136     
137     $(btnDelete).click(function () {
138         throw new Error("FIXME: not implemented yet");
139     });
140
141     var updateTRContent = function () {
142         if (btnTypeRakka.checked) {
143             $(trContent).find("th").text("Wiki source");
144             $(trContent).find("td").empty().append(fldRakkaSource);
145             $(btnPreview).show();
146         }
147         else if (btnTypeCSS.checked) {
148             $(trContent).find("th").text("CSS source");
149             $(trContent).find("td").empty().append(fldCSSSource);
150             $(btnPreview).hide();
151         }
152         else if (btnTypeBinary.checked) {
153             $(trContent).find("th").text("File");
154             $(trContent).find("td").empty().append(fldUploadFile);
155             $(btnPreview).show();
156         }
157         else if (btnTypeRedirect.checked) {
158             $(trContent).find("th").text("Destination Page");
159             $(trContent).find("td").empty().append(fldRedirect);
160             $(btnPreview).hide();
161         }
162     };
163     $(btnTypeRakka   ).change(updateTRContent);
164     $(btnTypeCSS     ).change(updateTRContent);
165     $(btnTypeBinary  ).change(updateTRContent);
166     $(btnTypeRedirect).change(updateTRContent);
167     updateTRContent();
168
169     var pageEditor
170         = $.TABLE({className: "pageEditor"},
171                   $.TBODY({},
172                           $.TR({},
173                                $.TH({}, "Page name"),
174                                $.TD({}, fldPageName)
175                               ),
176                           $.TR({},
177                                $.TH({}, "Page type"),
178                                $.TD({},
179                                     $.UL({},
180                                          $.LI({},
181                                               $.LABEL({},
182                                                       btnTypeRakka,
183                                                       "Wiki page"
184                                                      )
185                                              ),
186                                          $.LI({},
187                                               $.LABEL({},
188                                                       btnTypeCSS,
189                                                       "Style sheet"
190                                                      )
191                                              ),
192                                          $.LI({},
193                                               $.LABEL({},
194                                                       btnTypeBinary,
195                                                       "Binary file"
196                                                      )
197                                              ),
198                                          $.LI({},
199                                               $.LABEL({},
200                                                       btnTypeRedirect,
201                                                       "Redirection"
202                                                      )
203                                              )
204                                         )
205                                    )
206                               ),
207                           trContent,
208                           $.TR({},
209                                $.TH({}),
210                                $.TD({}, btnPreview, btnSubmit, btnDelete)
211                               )
212                          )
213                  );
214
215     if (oldRevision == null || oldRevision == 0) {
216         // 削除不可
217         $(btnDelete).hide();
218     }
219
220     $area.append(pageEditor);
221 };
222
223 Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
224     var doc = document.implementation.createDocument(
225         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
226
227     var page = doc.documentElement;
228
229     if (oldRevision != null) {
230         // ページ書換時
231         var updateInfo = doc.createElement("updateInfo");
232         updateInfo.setAttribute("oldRevision", oldRevision);
233
234         if (pageName != givenPageName) {
235             var move = doc.createElement("move");
236             move.setAttribute("from", pageName);
237             updateInfo.appendChild(move);
238         }
239
240         page.appendChild(updateInfo);
241     }
242
243     page.setAttribute("type", mimeType);
244
245     var textData = doc.createElement("textData");
246     textData.appendChild(
247         doc.createTextNode(text));
248
249     page.appendChild(textData);
250
251     Rakka.displayWaitingMessage("Submitting... please wait.");
252
253     var url = Rakka.baseURI + encodeURI(givenPageName);
254     $.ajax({
255         type       : "PUT",
256         url        : url,
257         contentType: "text/xml",
258         data       : doc,
259         processData: false,
260         success    : function () {
261             window.location.replace(url);
262         },
263         error      : function (req) {
264             Rakka.hideWaitingMessage();
265             
266             var $area = Rakka.switchScreen();
267             $area.text("Error: " + req.status + " " + req.statusText);
268         }
269     });
270 };
271
272 Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destination) {
273     var doc = document.implementation.createDocument(
274         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
275
276     var page = doc.documentElement;
277
278     if (oldRevision != null) {
279         // ページ書換時
280         var updateInfo = doc.createElement("updateInfo");
281         updateInfo.setAttribute("oldRevision", oldRevision);
282
283         if (pageName != givenPageName) {
284             var move = doc.createElement("move");
285             move.setAttribute("from", pageName);
286             updateInfo.appendChild(move);
287         }
288
289         page.appendChild(updateInfo);
290     }
291
292     page.setAttribute("redirect", destination);
293
294     Rakka.displayWaitingMessage("Submitting... please wait.");
295
296     var url = Rakka.baseURI + encodeURI(givenPageName);
297     $.ajax({
298         type       : "PUT",
299         url        : url,
300         contentType: "text/xml",
301         data       : doc,
302         processData: false,
303         success    : function () {
304             window.location.replace(url);
305         },
306         error      : function (req) {
307             Rakka.hideWaitingMessage();
308             
309             var $area = Rakka.switchScreen();
310             $area.text("Error: " + req.status + " " + req.statusText);
311         }
312     });
313 };