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.getSystemConfig = function () {
79 if (cachedConf != null) {
88 url : Rakka.baseURI + "systemConfig",
90 success: function (xml) {
91 $(xml).find("value").each(function () {
92 var path = this.getAttribute("path");
93 var decoder = decoder_of[path];
95 if (decoder == null) {
96 throw new Error("unknown config path: " + path);
99 conf[path] = decoder($(this).text());
103 error : function (req) {
104 throw new Error(req.status + " " + req.statusText);
111 Rakka.showConfigPanel = function () {
112 var conf = Rakka.getSystemConfig();
113 var $area = Rakka.switchScreen();
115 $area.append($.H1({}, "Configuration"));
118 = $.INPUT({type: "text", value: conf.siteName});
121 = $.INPUT({type: "text", value: conf.baseURI});
124 = $.INPUT({type: "text", value: conf.defaultPage});
127 = $.INPUT({type: "text", value: conf.styleSheet});
130 = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
133 = $.INPUT({type: "checkbox", checked: conf.globalLock});
136 = $.INPUT({type: "button", value: "Save"});
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;
143 var mkValue = function (path, value) {
144 var elem = doc.createElementNS(NS, "value");
145 elem.setAttribute("path", path);
146 elem.appendChild(doc.createTextNode(value));
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)));
157 Rakka.displayWaitingMessage("Submitting... please wait.");
159 var url = Rakka.baseURI + "systemConfig";
160 $.ajax({ type : "PUT",
162 contentType: "text/xml",
165 beforeSend : function (req) {
166 Rakka.setAuthorization(req);
168 success : function () {
170 Rakka.hideWaitingMessage();
171 Rakka.restoreScreen();
173 error : function (req) {
174 Rakka.hideWaitingMessage();
176 var $area = Rakka.switchScreen();
177 $area.text("Error: " + req.status + " " + req.statusText);
183 = $.INPUT({type: "button", value: "Cancel"});
185 $(btnCancel).click(function () {
187 if (window.confirm("Do you really want to discard changes?")) {
188 Rakka.restoreScreen();
192 Rakka.restoreScreen();
197 = $.TABLE({className: "pageEditor"},
200 $.TH({}, "Site name"),
201 $.TD({}, fldSiteName)
204 $.TH({}, "Base URI"),
208 $.TH({}, "Default page"),
209 $.TD({}, fldDefaultPage)
212 $.TH({}, "Style sheet"),
213 $.TD({}, fldStyleSheet)
216 $.TH({}, "Languages"),
217 $.TD({}, fldLanguages)
220 $.TH({}, "Global lock"),
224 "Disallow guest users to edit pages."))
228 $.TD({}, btnSave, btnCancel)
233 var validate = function () {
234 var isValid = (function () {
235 if (!isValidBaseURI(fldBaseURI.value)) {
239 if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
243 if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
247 if (!isValidMap(fldLanguages.value)) {
254 $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
258 var makeDirty = function () {
271 $area.append(configPanel);
274 $(document).ready(function () {
275 $("input.configButton")
277 Rakka.showConfigPanel();