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 Rakka.getSystemConfig = function () {
75 if (cachedConf != null) {
84 url : Rakka.baseURI + "systemConfig",
86 success: function (xml) {
87 $(xml).find("value").each(function () {
88 var path = this.getAttribute("path");
89 var decoder = decoder_of[path];
91 if (decoder == null) {
92 throw new Error("unknown config path: " + path);
95 conf[path] = decoder($(this).text());
99 error : function (req) {
100 throw new Error(req.status + " " + req.statusText);
107 Rakka.showConfigPanel = function () {
108 var conf = Rakka.getSystemConfig();
109 var $area = Rakka.switchScreen();
111 $area.append($.H1({}, "Configuration"));
114 = $.INPUT({type: "text", value: conf.siteName});
117 = $.INPUT({type: "text", value: conf.baseURI});
120 = $.INPUT({type: "text", value: conf.defaultPage});
123 = $.INPUT({type: "text", value: conf.styleSheet});
126 = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
129 = $.INPUT({type: "checkbox", checked: conf.globalLock});
132 = $.INPUT({type: "button", value: "Save"});
135 = $.INPUT({type: "button", value: "Cancel"});
138 = $.TABLE({className: "pageEditor"},
141 $.TH({}, "Site name"),
142 $.TD({}, fldSiteName)
145 $.TH({}, "Base URI"),
149 $.TH({}, "Default page"),
150 $.TD({}, fldDefaultPage)
153 $.TH({}, "Style sheet"),
154 $.TD({}, fldStyleSheet)
157 $.TH({}, "Languages"),
158 $.TD({}, fldLanguages)
161 $.TH({}, "Global lock"),
165 "Disallow guest users to edit pages."))
169 $.TD({}, btnSave, btnCancel)
174 var validate = function () {
175 var isValid = (function () {
176 if (!isValidBaseURI(fldBaseURI.value)) {
180 if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
184 if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
191 $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
195 var makeDirty = function () {
208 $area.append(configPanel);
211 $(document).ready(function () {
212 $("input.configButton")
214 Rakka.showConfigPanel();