]> gitweb @ CieloNegro.org - Rakka.git/blob - js/systemConfig.js
improvement of systemConfig.js
[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     Rakka.getSystemConfig = function () {
75         if (cachedConf != null) {
76             return cachedConf;
77         }
78
79         var conf = {};
80         cachedConf = conf;
81
82         $.ajax({
83             type   : "GET",
84             url    : Rakka.baseURI + "systemConfig",
85             async  : false,
86             success: function (xml) {
87                 $(xml).find("value").each(function () {
88                     var path    = this.getAttribute("path");
89                     var decoder = decoder_of[path];
90
91                     if (decoder == null) {
92                         throw new Error("unknown config path: " + path);
93                     }
94                     else {
95                         conf[path] = decoder($(this).text());
96                     }
97                 });
98             },
99             error  : function (req) {
100                 throw new Error(req.status + " " + req.statusText);
101             }
102         });
103
104         return conf;
105     };
106
107      Rakka.showConfigPanel = function () {
108          var conf  = Rakka.getSystemConfig();
109          var $area = Rakka.switchScreen();
110
111          $area.append($.H1({}, "Configuration"));
112
113          var fldSiteName
114              = $.INPUT({type: "text", value: conf.siteName});
115
116          var fldBaseURI
117              = $.INPUT({type: "text", value: conf.baseURI});
118
119          var fldDefaultPage
120              = $.INPUT({type: "text", value: conf.defaultPage});
121
122          var fldStyleSheet
123              = $.INPUT({type: "text", value: conf.styleSheet});
124
125          var fldLanguages
126              = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
127
128          var chkGlobalLock
129              = $.INPUT({type: "checkbox", checked: conf.globalLock});
130
131          var btnSave
132              = $.INPUT({type: "button", value: "Save"});
133
134          var btnCancel
135              = $.INPUT({type: "button", value: "Cancel"});
136
137          var configPanel
138              = $.TABLE({className: "pageEditor"},
139                        $.TBODY({},
140                                $.TR({},
141                                     $.TH({}, "Site name"),
142                                     $.TD({}, fldSiteName)
143                                    ),
144                                $.TR({},
145                                     $.TH({}, "Base URI"),
146                                     $.TD({}, fldBaseURI)
147                                    ),
148                                $.TR({},
149                                     $.TH({}, "Default page"),
150                                     $.TD({}, fldDefaultPage)
151                                    ),
152                                $.TR({},
153                                     $.TH({}, "Style sheet"),
154                                     $.TD({}, fldStyleSheet)
155                                    ),
156                                $.TR({},
157                                     $.TH({}, "Languages"),
158                                     $.TD({}, fldLanguages)
159                                    ),
160                                $.TR({},
161                                     $.TH({}, "Global lock"),
162                                     $.TD({},
163                                          $.LABEL({},
164                                                  chkGlobalLock,
165                                                  "Disallow guest users to edit pages."))
166                                    ),
167                                $.TR({},
168                                     $.TH({}),
169                                     $.TD({}, btnSave, btnCancel)
170                                    )
171                               )
172                       );
173
174          var validate = function () {
175              var isValid = (function () {
176                                 if (!isValidBaseURI(fldBaseURI.value)) {
177                                     return false;
178                                 }
179
180                                 if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
181                                     return false;
182                                 }
183
184                                 if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
185                                     return false;
186                                 }
187
188                                 return true;
189                             })();
190
191              $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
192          };
193
194          var isDirty = null;
195          var makeDirty = function () {
196              isDirty = true;
197          };
198
199          $(fldSiteName)
200              .add(fldBaseURI)
201              .add(fldDefaultPage)
202              .add(fldStyleSheet)
203              .add(fldLanguages)
204              .change(validate)
205              .keyup(validate)
206              .change(makeDirty);
207
208          $area.append(configPanel);
209      };
210
211     $(document).ready(function () {
212         $("input.configButton")
213             .click(function () {
214                        Rakka.showConfigPanel();
215                    });
216     });
217
218 })();