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