3 var identityDecoder = function (src) {
7 var identityEncoder = function (src) {
11 var mapDecoder = function (src) {
13 var lines = src.split(/\n/);
15 $.each(lines, function () {
16 var m = this.match(/^(\S+)\s+(\S+)$/);
24 var mapEncoder = function (map) {
27 $.each(map, function (key) {
28 lines.push(key + " " + this);
31 return lines.join("\n");
34 var boolDecoder = function (src) {
38 var boolEncoder = function (bool) {
39 return bool ? "*" : "";
43 siteName : identityDecoder,
44 baseURI : identityDecoder,
45 defaultPage: identityDecoder,
46 styleSheet : identityDecoder,
47 languages : mapDecoder,
48 globalLock : boolDecoder
52 siteName : identityEncoder,
53 baseURI : identityEncoder,
54 defaultPage: identityEncoder,
55 styleSheet : identityEncoder,
56 languages : mapEncoder,
57 globalLock : boolEncoder
60 var cachedConf = null;
62 var isValidBaseURI = function (str) {
63 parseUri.options.strictMode = true;
64 var uri = parseUri(str);
66 return (uri.protocol != "" &&
67 uri.authority != "" &&
69 uri.path.match(/\/$/) &&
74 var isValidMap = function (src) {
75 return src.match(/^\S+\s+\S+(?:\n\S+\s+\S+)*\n?$/) != null;
78 Rakka.getUserList = function () {
83 url: Rakka.baseURI + "users",
85 beforeSend: function (req) {
86 Rakka.setAuthorization(req);
88 success: function (xml) {
89 $(xml).find("user").each(function () {
90 users.push(this.getAttribute("id"));
93 error: function (req) {
94 throw new Error(req.status + " " + req.statusText);
101 Rakka.getSystemConfig = function () {
102 if (cachedConf != null) {
111 url : Rakka.baseURI + "systemConfig",
113 success: function (xml) {
114 $(xml).find("value").each(function () {
115 var path = this.getAttribute("path");
116 var decoder = decoder_of[path];
118 if (decoder == null) {
119 throw new Error("unknown config path: " + path);
122 conf[path] = decoder($(this).text());
126 error : function (req) {
127 throw new Error(req.status + " " + req.statusText);
134 var appendConfigPanel = function ($area) {
135 var conf = Rakka.getSystemConfig();
136 $area.append($.H1({}, "Configuration"));
139 = $.INPUT({type: "text", value: conf.siteName});
142 = $.INPUT({type: "text", value: conf.baseURI});
145 = $.INPUT({type: "text", value: conf.defaultPage});
148 = $.INPUT({type: "text", value: conf.styleSheet});
151 = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
154 = $.INPUT({type: "checkbox", checked: conf.globalLock});
157 = $.INPUT({type: "button", value: "Save"});
159 $(btnSave).click(function () {
160 var NS = "http://cielonegro.org/schema/Rakka/Config/1.0";
161 var doc = document.implementation.createDocument(NS, "systemConfig", null);
162 var sc = doc.documentElement;
164 var mkValue = function (path, value) {
165 var elem = doc.createElementNS(NS, "value");
166 elem.setAttribute("path", path);
167 elem.appendChild(doc.createTextNode(value));
171 sc.appendChild(mkValue("siteName" , fldSiteName.value));
172 sc.appendChild(mkValue("baseURI" , fldBaseURI.value));
173 sc.appendChild(mkValue("defaultPage", fldDefaultPage.value));
174 sc.appendChild(mkValue("styleSheet" , fldStyleSheet.value));
175 sc.appendChild(mkValue("languages" , fldLanguages.value));
176 sc.appendChild(mkValue("globalLock" , encoder_of["globalLock"](chkGlobalLock.checked)));
178 Rakka.displayWaitingMessage("Submitting... please wait.");
180 var url = Rakka.baseURI + "systemConfig";
181 $.ajax({ type : "PUT",
183 contentType: "text/xml",
186 beforeSend : function (req) {
187 Rakka.setAuthorization(req);
189 success : function () {
191 Rakka.hideWaitingMessage();
192 Rakka.restoreScreen();
194 error : function (req) {
195 Rakka.hideWaitingMessage();
197 var $area = Rakka.switchScreen();
198 $area.text("Error: " + req.status + " " + req.statusText);
204 = $.INPUT({type: "button", value: "Cancel"});
206 $(btnCancel).click(function () {
208 if (window.confirm("Do you really want to discard changes?")) {
209 Rakka.restoreScreen();
213 Rakka.restoreScreen();
218 = $.TABLE({className: "pageEditor"},
221 $.TH({}, "Site name"),
222 $.TD({}, fldSiteName)
225 $.TH({}, "Base URI"),
229 $.TH({}, "Default page"),
230 $.TD({}, fldDefaultPage)
233 $.TH({}, "Style sheet"),
234 $.TD({}, fldStyleSheet)
237 $.TH({}, "Languages"),
238 $.TD({}, fldLanguages)
241 $.TH({}, "Global lock"),
245 "Disallow guest users to edit pages."))
249 $.TD({}, btnSave, btnCancel)
254 var validate = function () {
255 var isValid = (function () {
256 if (!isValidBaseURI(fldBaseURI.value)) {
260 if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
264 if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
268 if (!isValidMap(fldLanguages.value)) {
275 $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
279 var makeDirty = function () {
292 $area.append(configPanel);
295 var appendUsersPanel = function ($area) {
296 $area.append($.H2({}, "Users"));
297 $area.append($.H3({}, "Existing Users"));
299 var tbody = $.TBODY();
302 = $.TABLE({className: "pageEditor"},
306 $.TH({}, "Change Password"),
307 $.TH({}, "Delete User")
313 var updateUserList = function () {
314 var users = Rakka.getUserList();
318 for (var i = 0; i < users.length; i++) {
319 var pass1 = $.INPUT({type: "password"});
320 var pass2 = $.INPUT({type: "password"});
321 var change = $.INPUT({type: "button", value: "Change"});
323 var chpass = $.TABLE({className: "pageEditor"},
326 $.TD({rowSpan: 2}, change)),
330 var delUser = $.INPUT({type: "button", value: "Delete"});
332 var validatePassword = function () {
333 var isValid = (function () {
334 if (pass1.value == "") {
338 if (pass1.value != pass2.value) {
344 $(change).attr({disabled: (isValid ? "" : "disabled")});
349 .change(validatePassword)
350 .keyup(validatePassword);
352 $.each(users, function () {
359 tbody.appendChild(tr);
365 $area.append(usersPanel);
367 $area.append($.H3({}, "Add new user"));
369 var userID = $.INPUT({type: "text"});
370 var pass1 = $.INPUT({type: "password"});
371 var pass2 = $.INPUT({type: "password"});
372 var addUser = $.INPUT({type: "button", value: "Add"});
373 var addUserPanel = $.TABLE({className: "pageEditor"},
378 $.TH({}, "Password"),
381 $.TH({}, "Password (retype)"),
387 $area.append(addUserPanel);
390 Rakka.showConfigPanel = function () {
391 var $area = Rakka.switchScreen();
393 appendConfigPanel($area);
394 appendUsersPanel($area);
397 $(document).ready(function () {
398 $("input.configButton")
400 Rakka.showConfigPanel();