3 var $previewHeader = null;
4 var $previewArea = null;
6 Rakka.editPage = function (pageName) {
7 var $area = Rakka.switchScreen();
9 Rakka.displayWaitingMessage("Loading... please wait.");
13 url : Rakka.baseURI + pageName + ".xml",
14 success: function (pageXml) {
15 Rakka.hideWaitingMessage();
17 if (pageXml.documentElement.tagName == "page") {
18 var $page = $(pageXml).find("page");
19 var oldRevision = $page.attr("revision");
21 = $page.attr("isBinary") == "yes" ? "binary"
22 : $page.attr("type") == "text/x-rakka" ? "rakka"
23 : $page.attr("type") == "text/css" ? "css"
24 : $page.attr("redirect") != null ? "redirect"
27 var lang = $page.attr("lang");
28 var isLocked = $page.attr("isLocked") == "yes";
29 var otherLangs = (function () {
31 $page.find("otherLang > link").each(function () {
32 obj[this.getAttribute("lang")] = this.getAttribute("page");
37 = $page.attr("redirect") != null ? $page.attr("redirect")
38 : $page.find("textData").text()
40 var summary = $page.find("summary").text();
42 displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary);
45 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
48 error : function (req) {
49 Rakka.hideWaitingMessage();
51 if (req.status == 404) {
52 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
55 $area.text("Error: " + req.status + " " + req.statusText);
61 Rakka.newPage = function () {
62 displayPageEditor("", null, "rakka", null, false, {}, null, "");
65 var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary) {
66 var $area = Rakka.switchScreen();
68 $previewHeader = $( $.H1({}, "Preview") );
69 $area.append($previewHeader);
70 $previewHeader.hide();
72 $previewArea = $( $.DIV({className: "preview"}) );
73 $area.append($previewArea);
76 $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
79 var makeDirty = function () {
84 = $.INPUT({type : "text", value: pageName});
86 $(fldPageName).change(makeDirty);
89 = $.INPUT({type : "checkbox",
90 checked : (isLocked ? "checked" : "")});
92 $(chkIsLocked).change(makeDirty);
96 $.TH({}, "Page lock"),
100 "Disallow anonymous users to edit or delete this page")));
103 = $.INPUT({type : "radio",
105 checked: (defaultType == "rakka" ? "checked" : "")});
107 $(btnTypeRakka).change(makeDirty);
110 = $.INPUT({type : "radio",
112 checked: (defaultType == "css" ? "checked" : "")});
114 $(btnTypeCSS).change(makeDirty);
117 = $.INPUT({type : "radio",
119 checked: (defaultType == "binary" ? "checked" : "")});
121 $(btnTypeBinary).change(makeDirty);
124 = $.INPUT({type : "radio",
126 checked: (defaultType == "redirect" ? "checked" : "")});
128 $(btnTypeRedirect).change(makeDirty);
132 $.OPTION({value: ""}, "(unspecified)"),
136 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
138 $.OPTION({value: tag}, name));
144 $(selPageLang).change(makeDirty);
146 if (lang == null || lang == "") {
147 $(selPageLang).val($("html").attr("xml:lang"));
150 $(selPageLang).val(lang);
155 $.TH({}, "Page language"),
156 $.TD({}, selPageLang));
158 var trOtherLangs = (function () {
161 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
163 $.OPTION({value: tag}, name));
166 var selLang = $.SELECT({}, options);
167 var fldLink = $.INPUT({type: "text", className: "smallField"});
169 $(selLang).change(function () {
170 var pageName = otherLangs[$(selLang).val()];
172 pageName == null ? "" : pageName
174 }).trigger("change");
176 var onLinkChanged = function () {
179 var lang = $(selLang).val();
180 var pageName = $(this).val();
182 if (pageName == "") {
183 delete otherLangs[lang];
186 otherLangs[lang] = pageName;
189 $(fldLink).change(onLinkChanged).keyup(onLinkChanged);
192 $.TH({}, "Language links"),
193 $.TD({}, selLang, fldLink));
197 = $.TEXTAREA({className: "summary"}, summary);
199 $(fldSummary).change(makeDirty);
204 $.TD({}, fldSummary));
207 = $.TEXTAREA({className: "source"},
208 (defaultType == "rakka" && source != null ? source : ""));
210 $(fldRakkaSource).change(makeDirty);
213 = $.TEXTAREA({className: "source"},
214 (defaultType == "css" && source != null ? source : ""));
216 $(fldCSSSource).change(makeDirty);
219 = $.INPUT({type: "file"});
221 $(fldUploadFile).change(makeDirty);
224 = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
226 $(fldRedirect).change(makeDirty);
235 = $.INPUT({type: "button", value: "Preview page"});
237 $(btnPreview).click(function () {
238 if (btnTypeRakka.checked) {
240 fldPageName.value, fldRakkaSource.value);
242 else if (btnTypeBinary.checked) {
243 if (fldUploadFile.value != "") {
245 fldPageName.value, fldUploadFile.value);
251 = $.INPUT({type: "button", value: "Submit page"});
253 $(btnSubmit).click(function () {
254 if (btnTypeRakka.checked) {
261 $(selPageLang).val(),
264 fldRakkaSource.value);
266 else if (btnTypeCSS.checked) {
273 $(selPageLang).val(),
278 else if (btnTypeBinary.checked) {
279 if (fldUploadFile.value != "") {
285 $(selPageLang).val(),
288 fldUploadFile.value);
291 else if (btnTypeRedirect.checked) {
302 = $.INPUT({type: "button", value: "Delete this page"});
304 $(btnDelete).click(function () {
305 if (window.confirm("Do you really want to delete this page?")) {
306 deletePage(pageName);
311 = $.INPUT({type: "button", value: "Cancel editing"});
313 $(btnCancel).click(function () {
315 if (window.confirm("Do you really want to discard changes?")) {
316 Rakka.restoreScreen();
320 Rakka.restoreScreen();
324 var updateTRContent = function () {
325 if (btnTypeRakka.checked) {
326 $(trPageLang).show();
327 $(trOtherLangs).show();
329 $(trContent).find("th").text("Wiki source");
330 $(trContent).find("td").empty().append(fldRakkaSource);
331 $(btnPreview).show();
333 else if (btnTypeCSS.checked) {
334 $(trPageLang).show();
335 $(trOtherLangs).show();
337 $(trContent).find("th").text("CSS source");
338 $(trContent).find("td").empty().append(fldCSSSource);
339 $(btnPreview).hide();
341 else if (btnTypeBinary.checked) {
342 $(trPageLang).show();
343 $(trOtherLangs).show();
345 $(trContent).find("th").text("File");
346 $(trContent).find("td").empty().append(fldUploadFile);
347 $(btnPreview).show();
349 else if (btnTypeRedirect.checked) {
350 $(trPageLang).hide();
351 $(trOtherLangs).hide();
353 $(trContent).find("th").text("Destination Page");
354 $(trContent).find("td").empty().append(fldRedirect);
355 $(btnPreview).hide();
358 $(btnTypeRakka ).change(updateTRContent);
359 $(btnTypeCSS ).change(updateTRContent);
360 $(btnTypeBinary ).change(updateTRContent);
361 $(btnTypeRedirect).change(updateTRContent);
365 = $.TABLE({className: "pageEditor"},
368 $.TH({}, "Page name"),
369 $.TD({}, fldPageName)
373 $.TH({}, "Page type"),
409 $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
414 var validate = function () {
415 var isValid = (function () {
416 if (fldPageName.value.match(Rakka.rePageName) == null) {
420 if (btnTypeRedirect.checked) {
421 if (fldRedirect.value.match(Rakka.rePageName) == null) {
426 for (var tag in otherLangs) {
427 if (otherLangs[tag].match(Rakka.rePageName) == null) {
432 if (btnTypeBinary.checked) {
433 if (fldUploadFile.value == "") {
442 $(btnSubmit).attr({disabled: (isValid ? "" : "disabled")});
448 .add(btnTypeRedirect)
449 .add($(trOtherLangs).find("input"))
456 if (oldRevision == null || oldRevision == 0) {
461 $area.append(pageEditor);
463 if (!Rakka.isLoggedIn() || Rakka.isGlobalLocked) {
464 $(trIsLocked).hide();
468 var previewRakkaPage = function (pageName, source) {
469 Rakka.displayWaitingMessage("Loading... please wait.");
471 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
475 contentType: "text/x-rakka",
478 success : function (resultDoc) {
479 Rakka.hideWaitingMessage();
480 showPreview(resultDoc);
482 error : function (req) {
483 Rakka.hideWaitingMessage();
484 alert("Error: " + req.status + " " + req.statusText);
489 var previewBinaryPage = function (pageName, path) {
490 Rakka.displayWaitingMessage("Loading... please wait.");
492 /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
493 var bin = Rakka.loadLocalBinaryFile(path);
494 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
498 contentType: "application/x-rakka-base64-stream",
499 data : Rakka.encodeBase64(bin),
501 success : function (resultDoc) {
502 Rakka.hideWaitingMessage();
503 showPreview(resultDoc);
505 error : function (req) {
506 Rakka.hideWaitingMessage();
507 alert("Error: " + req.status + " " + req.statusText);
512 var showPreview = function (doc) {
513 $previewArea.empty();
515 $previewHeader.show();
518 var root = doc.documentElement;
519 var child = root.firstChild;
521 if (child.nodeType == 1) {
523 $previewArea.append(child.cloneNode(true));
525 } while (child = child.nextSibling);
527 Rakka.scrollToTopLeft();
531 = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) {
532 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
533 var doc = document.implementation.createDocument(NS, "page", null);
534 var page = doc.documentElement;
536 if (oldRevision != null) {
538 var updateInfo = doc.createElementNS(NS, "updateInfo");
539 updateInfo.setAttribute("oldRevision", oldRevision);
541 if (pageName != givenPageName) {
542 var move = doc.createElementNS(NS, "move");
543 move.setAttribute("from", pageName);
544 updateInfo.appendChild(move);
547 page.appendChild(updateInfo);
550 page.setAttribute("isLocked", isLocked ? "yes" : "no");
551 page.setAttribute("type", mimeType);
553 if (lang != null && lang != "") {
554 page.setAttribute("lang", lang);
557 if (summary != null && summary != "") {
558 var s = doc.createElementNS(NS, "summary");
560 doc.createTextNode(summary));
564 var oLang = doc.createElementNS(NS, "otherLang");
565 for (var tag in otherLangs) {
566 var link = doc.createElementNS(NS, "link");
567 link.setAttribute("lang", tag);
568 link.setAttribute("page", otherLangs[tag]);
569 oLang.appendChild(link);
571 page.appendChild(oLang);
573 var textData = doc.createElementNS(NS, "textData");
574 textData.appendChild(
575 doc.createTextNode(text));
577 page.appendChild(textData);
579 Rakka.displayWaitingMessage("Submitting... please wait.");
581 var url = Rakka.baseURI + encodeURI(givenPageName);
585 contentType: "text/xml",
588 beforeSend : function (req) {
589 Rakka.setAuthorization(req);
591 success : function () {
592 window.location.replace(url);
594 error : function (req) {
595 Rakka.hideWaitingMessage();
597 var $area = Rakka.switchScreen();
598 $area.text("Error: " + req.status + " " + req.statusText);
603 var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, path) {
604 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
605 var doc = document.implementation.createDocument(NS, "page", null);
606 var page = doc.documentElement;
608 if (oldRevision != null) {
610 var updateInfo = doc.createElementNS(NS, "updateInfo");
611 updateInfo.setAttribute("oldRevision", oldRevision);
613 if (pageName != givenPageName) {
614 var move = doc.createElementNS(NS, "move");
615 move.setAttribute("from", pageName);
616 updateInfo.appendChild(move);
619 page.appendChild(updateInfo);
622 page.setAttribute("isLocked", isLocked ? "yes" : "no");
623 page.setAttribute("type", "");
625 if (lang != null && lang != "") {
626 page.setAttribute("lang", lang);
629 if (summary != null) {
630 var s = doc.createElementNS(NS, "summary");
632 doc.createTextNode(summary));
636 var oLang = doc.createElementNS(NS, "otherLang");
637 for (var tag in otherLangs) {
638 var link = doc.createElementNS(NS, "link");
639 link.setAttribute("lang", tag);
640 link.setAttribute("page", otherLangs[tag]);
641 oLang.appendChild(link);
643 page.appendChild(oLang);
645 var bin = Rakka.loadLocalBinaryFile(path);
646 var b64 = Rakka.encodeBase64(bin);
648 var binaryData = doc.createElementNS(NS, "binaryData");
649 binaryData.appendChild(
650 doc.createTextNode(b64));
652 page.appendChild(binaryData);
654 Rakka.displayWaitingMessage("Submitting... please wait.");
656 var url = Rakka.baseURI + encodeURI(givenPageName);
660 contentType: "text/xml",
663 beforeSend : function (req) {
664 Rakka.setAuthorization(req);
666 success : function () {
667 window.location.replace(url);
669 error : function (req) {
670 Rakka.hideWaitingMessage();
672 var $area = Rakka.switchScreen();
673 $area.text("Error: " + req.status + " " + req.statusText);
678 var submitRedirection = function (pageName, oldRevision, givenPageName, isLocked, destination) {
679 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
680 var doc = document.implementation.createDocument(NS, "page", null);
681 var page = doc.documentElement;
683 if (oldRevision != null) {
685 var updateInfo = doc.createElementNS(NS, "updateInfo");
686 updateInfo.setAttribute("oldRevision", oldRevision);
688 if (pageName != givenPageName) {
689 var move = doc.createElementNS(NS, "move");
690 move.setAttribute("from", pageName);
691 updateInfo.appendChild(move);
694 page.appendChild(updateInfo);
697 page.setAttribute("isLocked", isLocked ? "yes" : "no");
698 page.setAttribute("redirect", destination);
700 Rakka.displayWaitingMessage("Submitting... please wait.");
702 var url = Rakka.baseURI + encodeURI(givenPageName);
706 contentType: "text/xml",
709 beforeSend : function (req) {
710 Rakka.setAuthorization(req);
712 success : function () {
713 window.location.replace(url);
715 error : function (req) {
716 Rakka.hideWaitingMessage();
718 var $area = Rakka.switchScreen();
719 $area.text("Error: " + req.status + " " + req.statusText);
724 var deletePage = function (pageName) {
725 var url = Rakka.baseURI + encodeURI(pageName);
729 beforeSend : function (req) {
730 Rakka.setAuthorization(req);
732 success : function () {
733 window.location.replace(url);
735 error : function (req) {
736 Rakka.hideWaitingMessage();
738 var $area = Rakka.switchScreen();
739 $area.text("Error: " + req.status + " " + req.statusText);