]> gitweb @ CieloNegro.org - Rakka.git/blob - js/editPage.js
we can now create new pages
[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                 :                                            "unknown"
19                 ;
20             var source = $page.find("textData").text();
21             Rakka.displayPageEditor(baseURI, pageName, oldRevision, defaultType, source);
22         },
23         error  : function (req) {
24             Rakka.hideWaitingMessage();
25             
26             if (req.status == 404) {
27                 Rakka.displayPageEditor(baseURI, pageName, null, "rakka", null);
28             }
29             else {
30                 $area.text("Error: " + req.status + " " + req.statusText);
31             }
32         }
33     });
34 };
35
36 Rakka.newPage = function (baseURI) {
37     Rakka.displayPageEditor(baseURI, "", null, "rakka", null);
38 };
39
40 Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, source) {
41     var $area = Rakka.switchScreen();
42     $area.empty();
43
44     $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
45
46     var fldPageName
47         = $.INPUT({type : "text", value: pageName});
48
49     var btnTypeRakka
50         = $.INPUT({type   : "radio",
51                    name   : "type",
52                    checked: (defaultType == "rakka"  ? "checked" : "")});
53
54     var btnTypeCSS
55         = $.INPUT({type   : "radio",
56                    name   : "type",
57                    checked: (defaultType == "css"    ? "checked" : "")});
58
59     var btnTypeBinary
60         = $.INPUT({type   : "radio",
61                    name   : "type",
62                    checked: (defaultType == "binary" ? "checked" : "")});
63     
64
65     var fldRakkaSource
66         = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : ""));
67
68     var fldCSSSource
69         = $.TEXTAREA({}, (defaultType == "css"   && source != null ? source : ""));
70
71     var fldUploadFile
72         = $.INPUT({type: "file"});
73
74     var trContent
75         = $.TR({}, 
76                $.TH({}),
77                $.TD({})
78               );
79
80     var btnPreview
81         = $.INPUT({type: "button", value: "Preview page"});
82     
83     $(btnPreview).click(function () {
84         throw new Error("FIXME: not implemented yet");
85     });
86
87     var btnSubmit
88         = $.INPUT({type: "button", value: "Submit page"});
89     
90     $(btnSubmit).click(function () {
91         if (btnTypeRakka.checked) {
92             Rakka.submitTextPage(
93                 baseURI,
94                 pageName,
95                 oldRevision,
96                 fldPageName.value,
97                 "text/x-rakka",
98                 fldRakkaSource.value);
99         }
100         else if (btnTypeCSS.checked) {
101             Rakka.submitTextPage(
102                 baseURI,
103                 pageName,
104                 oldRevision,
105                 fldPageName.value,
106                 "text/css",
107                 fldCSSSource.value);
108         }
109         else if (btnTypeBinary.checked) {
110             Rakka.submitBinaryPage(
111                 baseURI,
112                 pageName,
113                 oldRevision,
114                 fldPageName.value,
115                 fldUploadFile.value);
116         }
117     });
118
119     var btnDelete
120         = $.INPUT({type: "button", value: "Delete this page"});
121     
122     $(btnDelete).click(function () {
123         throw new Error("FIXME: not implemented yet");
124     });
125
126     var updateTRContent = function () {
127         if (btnTypeRakka.checked) {
128             $(trContent).find("th").text("Wiki source");
129             $(trContent).find("td").empty().append(fldRakkaSource);
130         }
131         else if (btnTypeCSS.checked) {
132             $(trContent).find("th").text("CSS source");
133             $(trContent).find("td").empty().append(fldCSSSource);
134         }
135         else if (btnTypeBinary.checked) {
136             $(trContent).find("th").text("File");
137             $(trContent).find("td").empty().append(fldUploadFile);
138         }
139     };
140     $(btnTypeRakka ).change(updateTRContent);
141     $(btnTypeCSS   ).change(updateTRContent);
142     $(btnTypeBinary).change(updateTRContent);
143     updateTRContent();
144
145     var pageEditor
146         = $.TABLE({className: "pageEditor"},
147                   $.TBODY({},
148                           $.TR({},
149                                $.TH({}, "Page name"),
150                                $.TD({}, fldPageName)
151                               ),
152                           $.TR({},
153                                $.TH({}, "Page type"),
154                                $.TD({},
155                                     $.UL({},
156                                          $.LI({},
157                                               $.LABEL({},
158                                                       btnTypeRakka,
159                                                       "Wiki page"
160                                                      )
161                                              ),
162                                          $.LI({},
163                                               $.LABEL({},
164                                                       btnTypeCSS,
165                                                       "Style sheet"
166                                                      )
167                                              ),
168                                          $.LI({},
169                                               $.LABEL({},
170                                                       btnTypeBinary,
171                                                       "Binary file"
172                                                      )
173                                              )
174                                         )
175                                    )
176                               ),
177                           trContent,
178                           $.TR({},
179                                $.TH({}),
180                                $.TD({}, btnPreview, btnSubmit, btnDelete)
181                               )
182                          )
183                  );
184
185     if (oldRevision == null || oldRevision == 0) {
186         // 削除不可
187         $(btnDelete).hide();
188     }
189
190     $area.append(pageEditor);
191 };
192
193 Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName, mimeType, text) {
194     var doc = document.implementation.createDocument(
195         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
196
197     var page = doc.documentElement;
198
199     if (oldRevision != null) {
200         // ページ書換時
201         var updateInfo = doc.createElement("updateInfo");
202         updateInfo.setAttribute("oldRevision", oldRevision);
203
204         if (pageName != givenPageName) {
205             var move = doc.createElement("move");
206             move.setAttribute("from", pageName);
207             updateInfo.appendChild(move);
208         }
209
210         page.appendChild(updateInfo);
211     }
212
213     if (0) {
214         // redirection
215     }
216     else {
217         page.setAttribute("type", mimeType);
218
219         var textData = doc.createElement("textData");
220         textData.appendChild(
221             doc.createTextNode(text));
222
223         page.appendChild(textData);
224     }
225
226     Rakka.displayWaitingMessage("Submitting... please wait.");
227
228     var url = baseURI + encodeURI(givenPageName);
229     $.ajax({
230         type       : "PUT",
231         url        : url,
232         contentType: "text/xml",
233         data       : doc,
234         processData: false,
235         success    : function () {
236             window.location.replace(url);
237         },
238         error      : function (req) {
239             Rakka.hideWaitingMessage();
240             
241             var $area = Rakka.switchScreen();
242             $area.text("Error: " + req.status + " " + req.statusText);
243         }
244     });
245 };