]> gitweb @ CieloNegro.org - Rakka.git/blob - js/systemConfig.js
/systemConfig now works
[Rakka.git] / js / systemConfig.js
1 (function () {
2
3      var identityDecoder = function (src) {
4          return src;
5      };
6
7      var identityEncoder = function (src) {
8          return src;
9      };
10
11      var mapDecoder = function (src) {
12          var map   = {};
13          var lines = src.split(/\n/);
14
15          $.each(lines, function () {
16                     var m = this.match(/^(\S+)\s+(\S+)$/);
17
18                     map[ m[1] ] = m[2];
19                 });
20
21          return map;
22      };
23
24      var mapEncoder = function (map) {
25          var lines = [];
26
27          $.each(map, function (key) {
28                     lines.push(key + " " + this);
29                 });
30
31          return lines.join("\n");
32      };
33
34      var boolDecoder = function (src) {
35          return src == "*";
36      };
37
38      var boolEncoder = function (bool) {
39          return bool ? "*" : "";
40      };
41
42      var decoder_of = {
43          siteName   : identityDecoder,
44          baseURI    : identityDecoder,
45          defaultPage: identityDecoder,
46          styleSheet : identityDecoder,
47          languages  : mapDecoder,
48          globalLock : boolDecoder
49      };
50
51      var encoder_of = {
52          siteName   : identityEncoder,
53          baseURI    : identityEncoder,
54          defaultPage: identityEncoder,
55          styleSheet : identityEncoder,
56          languages  : mapEncoder,
57          globalLock : boolEncoder
58      };
59
60      var cachedConf = null;
61
62      var isValidBaseURI = function (str) {
63          parseUri.options.strictMode = true;
64          var uri = parseUri(str);
65
66          return (uri.protocol != "" &&
67                  uri.authority != "" &&
68                  uri.path != "" &&
69                  uri.path.match(/\/$/) &&
70                  uri.query == "" &&
71                  uri.anchor == "");
72      };
73
74      var isValidMap = function (src) {
75          return src.match(/^\S+\s+\S+(?:\n\S+\s+\S+)*\n?$/) != null;
76      };
77
78     Rakka.getSystemConfig = function () {
79         if (cachedConf != null) {
80             return cachedConf;
81         }
82
83         var conf = {};
84         cachedConf = conf;
85
86         $.ajax({
87             type   : "GET",
88             url    : Rakka.baseURI + "systemConfig",
89             async  : false,
90             success: function (xml) {
91                 $(xml).find("value").each(function () {
92                     var path    = this.getAttribute("path");
93                     var decoder = decoder_of[path];
94
95                     if (decoder == null) {
96                         throw new Error("unknown config path: " + path);
97                     }
98                     else {
99                         conf[path] = decoder($(this).text());
100                     }
101                 });
102             },
103             error  : function (req) {
104                 throw new Error(req.status + " " + req.statusText);
105             }
106         });
107
108         return conf;
109     };
110
111      Rakka.showConfigPanel = function () {
112          var conf  = Rakka.getSystemConfig();
113          var $area = Rakka.switchScreen();
114
115          $area.append($.H1({}, "Configuration"));
116
117          var fldSiteName
118              = $.INPUT({type: "text", value: conf.siteName});
119
120          var fldBaseURI
121              = $.INPUT({type: "text", value: conf.baseURI});
122
123          var fldDefaultPage
124              = $.INPUT({type: "text", value: conf.defaultPage});
125
126          var fldStyleSheet
127              = $.INPUT({type: "text", value: conf.styleSheet});
128
129          var fldLanguages
130              = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
131
132          var chkGlobalLock
133              = $.INPUT({type: "checkbox", checked: conf.globalLock});
134
135          var btnSave
136              = $.INPUT({type: "button", value: "Save"});
137
138          $(btnSave).click(function () {
139                               var NS  = "http://cielonegro.org/schema/Rakka/Config/1.0";
140                               var doc = document.implementation.createDocument(NS, "systemConfig", null);
141                               var sc  = doc.documentElement;
142
143                               var mkValue = function (path, value) {
144                                   var elem = doc.createElementNS(NS, "value");
145                                   elem.setAttribute("path", path);
146                                   elem.appendChild(doc.createTextNode(value));
147                                   return elem;
148                               };
149
150                               sc.appendChild(mkValue("siteName"   , fldSiteName.value));
151                               sc.appendChild(mkValue("baseURI"    , fldBaseURI.value));
152                               sc.appendChild(mkValue("defaultPage", fldDefaultPage.value));
153                               sc.appendChild(mkValue("styleSheet" , fldStyleSheet.value));
154                               sc.appendChild(mkValue("languages"  , fldLanguages.value));
155                               sc.appendChild(mkValue("globalLock" , encoder_of["globalLock"](chkGlobalLock.checked)));
156
157                               Rakka.displayWaitingMessage("Submitting... please wait.");
158
159                               var url = Rakka.baseURI + "systemConfig";
160                               $.ajax({ type       : "PUT",
161                                        url        : url,
162                                        contentType: "text/xml",
163                                        data       : doc,
164                                        processData: false,
165                                        beforeSend : function (req) {
166                                            Rakka.setAuthorization(req);
167                                        },
168                                        success    : function () {
169                                            cachedConf = null;
170                                            Rakka.hideWaitingMessage();
171                                            Rakka.restoreScreen();
172                                        },
173                                        error      : function (req) {
174                                            Rakka.hideWaitingMessage();
175
176                                            var $area = Rakka.switchScreen();
177                                            $area.text("Error: " + req.status + " " + req.statusText);
178                                        }
179                                      });
180                           });
181
182          var btnCancel
183              = $.INPUT({type: "button", value: "Cancel"});
184
185          $(btnCancel).click(function () {
186              if (isDirty) {
187                  if (window.confirm("Do you really want to discard changes?")) {
188                     Rakka.restoreScreen();
189                  }
190              }
191              else {
192                  Rakka.restoreScreen();
193              }
194          });
195
196          var configPanel
197              = $.TABLE({className: "pageEditor"},
198                        $.TBODY({},
199                                $.TR({},
200                                     $.TH({}, "Site name"),
201                                     $.TD({}, fldSiteName)
202                                    ),
203                                $.TR({},
204                                     $.TH({}, "Base URI"),
205                                     $.TD({}, fldBaseURI)
206                                    ),
207                                $.TR({},
208                                     $.TH({}, "Default page"),
209                                     $.TD({}, fldDefaultPage)
210                                    ),
211                                $.TR({},
212                                     $.TH({}, "Style sheet"),
213                                     $.TD({}, fldStyleSheet)
214                                    ),
215                                $.TR({},
216                                     $.TH({}, "Languages"),
217                                     $.TD({}, fldLanguages)
218                                    ),
219                                $.TR({},
220                                     $.TH({}, "Global lock"),
221                                     $.TD({},
222                                          $.LABEL({},
223                                                  chkGlobalLock,
224                                                  "Disallow guest users to edit pages."))
225                                    ),
226                                $.TR({},
227                                     $.TH({}),
228                                     $.TD({}, btnSave, btnCancel)
229                                    )
230                               )
231                       );
232
233          var validate = function () {
234              var isValid = (function () {
235                                 if (!isValidBaseURI(fldBaseURI.value)) {
236                                     return false;
237                                 }
238
239                                 if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
240                                     return false;
241                                 }
242
243                                 if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
244                                     return false;
245                                 }
246
247                                 if (!isValidMap(fldLanguages.value)) {
248                                     return false;
249                                 }
250
251                                 return true;
252                             })();
253
254              $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
255          };
256
257          var isDirty = null;
258          var makeDirty = function () {
259              isDirty = true;
260          };
261
262          $(fldSiteName)
263              .add(fldBaseURI)
264              .add(fldDefaultPage)
265              .add(fldStyleSheet)
266              .add(fldLanguages)
267              .change(validate)
268              .keyup(validate)
269              .change(makeDirty);
270
271          $area.append(configPanel);
272      };
273
274     $(document).ready(function () {
275         $("input.configButton")
276             .click(function () {
277                        Rakka.showConfigPanel();
278                    });
279     });
280
281 })();