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