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("type") == "text/javascript" ? "js"
25 : $page.attr("redirect") != null ? "redirect"
28 var lang = $page.attr("lang");
29 var isLocked = $page.attr("isLocked") == "yes";
30 var otherLangs = (function () {
32 $page.find("otherLang > link").each(function () {
33 obj[this.getAttribute("lang")] = this.getAttribute("page");
38 = $page.attr("redirect") != null ? $page.attr("redirect")
39 : $page.attr("isBinary") != null ? Rakka.decodeBase64($page.find("binaryData").text())
40 : $page.find("textData").text()
42 var summary = $page.find("summary").text();
44 displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary);
47 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
50 error : function (req) {
51 Rakka.hideWaitingMessage();
53 if (req.status == 404) {
54 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
57 $area.text("Error: " + req.status + " " + req.statusText);
63 Rakka.newPage = function () {
64 displayPageEditor("", null, "rakka", null, false, {}, null, "");
67 var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary) {
68 var $area = Rakka.switchScreen();
70 $previewHeader = $( $.H1({}, "Preview") );
71 $area.append($previewHeader);
72 $previewHeader.hide();
74 $previewArea = $( $.DIV({className: "preview"}) );
75 $area.append($previewArea);
78 $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
81 var makeDirty = function () {
86 = $.INPUT({type : "text", value: pageName});
88 $(fldPageName).change(makeDirty);
91 = $.INPUT({type : "checkbox",
92 checked : (isLocked ? "checked" : "")});
94 $(chkIsLocked).change(makeDirty);
98 $.TH({}, "Page lock"),
102 "Disallow anonymous users to edit or delete this page")));
105 = $.INPUT({type : "radio",
107 checked: (defaultType == "rakka" ? "checked" : "")});
109 $(btnTypeRakka).change(makeDirty);
112 = $.INPUT({type : "radio",
114 checked: (defaultType == "css" ? "checked" : "")});
116 $(btnTypeCSS).change(makeDirty);
119 = $.INPUT({type : "radio",
121 checked: (defaultType == "js" ? "checked" : "")});
122 $(btnTypeJS).change(makeDirty);
125 = $.INPUT({type : "radio",
127 checked: (defaultType == "binary" ? "checked" : "")});
129 $(btnTypeBinary).change(makeDirty);
132 = $.INPUT({type : "radio",
134 checked: (defaultType == "redirect" ? "checked" : "")});
136 $(btnTypeRedirect).change(makeDirty);
140 $.OPTION({value: ""}, "(unspecified)"),
144 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
146 $.OPTION({value: tag}, name));
152 $(selPageLang).change(makeDirty);
154 if (lang == null || lang == "") {
155 $(selPageLang).val($("html").attr("xml:lang"));
158 $(selPageLang).val(lang);
163 $.TH({}, "Page language"),
164 $.TD({}, selPageLang));
166 var trOtherLangs = (function () {
169 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
171 $.OPTION({value: tag}, name));
174 var selLang = $.SELECT({}, options);
175 var fldLink = $.INPUT({type: "text", className: "smallField"});
177 $(selLang).change(function () {
178 var pageName = otherLangs[$(selLang).val()];
180 pageName == null ? "" : pageName
182 }).trigger("change");
184 var onLinkChanged = function () {
187 var lang = $(selLang).val();
188 var pageName = $(this).val();
190 if (pageName == "") {
191 delete otherLangs[lang];
194 otherLangs[lang] = pageName;
197 $(fldLink).change(onLinkChanged).keyup(onLinkChanged);
200 $.TH({}, "Language links"),
201 $.TD({}, selLang, fldLink));
205 = $.TEXTAREA({className: "summary"}, summary);
207 $(fldSummary).change(makeDirty);
212 $.TD({}, fldSummary));
215 = $.TEXTAREA({className: "source"},
216 (defaultType == "rakka" && source != null ? source : ""));
218 $(fldRakkaSource).change(makeDirty);
221 = $.TEXTAREA({className: "source"},
222 (defaultType == "css" && source != null ? source : ""));
224 $(fldCSSSource).change(makeDirty);
227 = $.TEXTAREA({className: "source"},
228 (defaultType == "js" && source != null ? source : ""));
230 $(fldJSSource).change(makeDirty);
233 = (defaultType == "binary" && source != null ? source : "");
235 = $.TEXTAREA({className: "hexDump", disabled: true}, Rakka.hexDump(uploadFileBin, 128));
237 = $.INPUT({type: "button", value: "Select file..."});
239 $(btnSelectFile).click(function () {
240 var path = Rakka.selectFile("Select a binary file to upload", "open");
242 uploadFileBin = Rakka.loadLocalBinaryFile(path);
243 fldUploadFile.value = Rakka.hexDump(uploadFileBin, 128);
249 = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
251 $(fldRedirect).change(makeDirty);
260 = $.INPUT({type: "button", value: "Preview page"});
262 $(btnPreview).click(function () {
263 if (btnTypeRakka.checked) {
265 fldPageName.value, fldRakkaSource.value);
267 else if (btnTypeBinary.checked) {
268 if (uploadFileBin != "") {
270 fldPageName.value, uploadFileBin);
276 = $.INPUT({type: "button", value: "Submit page"});
278 $(btnSubmit).click(function () {
279 if (btnTypeRakka.checked) {
286 $(selPageLang).val(),
289 fldRakkaSource.value);
291 else if (btnTypeCSS.checked) {
298 $(selPageLang).val(),
303 else if (btnTypeJS.checked) {
310 $(selPageLang).val(),
315 else if (btnTypeBinary.checked) {
316 if (fldUploadFile.value != "") {
322 $(selPageLang).val(),
328 else if (btnTypeRedirect.checked) {
339 = $.INPUT({type: "button", value: "Delete this page"});
341 $(btnDelete).click(function () {
342 if (window.confirm("Do you really want to delete this page?")) {
343 deletePage(pageName);
348 = $.INPUT({type: "button", value: "Cancel editing"});
350 $(btnCancel).click(function () {
352 if (window.confirm("Do you really want to discard changes?")) {
353 Rakka.restoreScreen();
357 Rakka.restoreScreen();
361 var updateTRContent = function () {
362 if (btnTypeRakka.checked) {
363 $(trPageLang).show();
364 $(trOtherLangs).show();
366 $(trContent).find("th").text("Wiki source");
367 $(trContent).find("td").empty().append(fldRakkaSource);
368 $(btnPreview).show();
370 else if (btnTypeCSS.checked) {
371 $(trPageLang).show();
372 $(trOtherLangs).show();
374 $(trContent).find("th").text("CSS source");
375 $(trContent).find("td").empty().append(fldCSSSource);
376 $(btnPreview).hide();
378 else if (btnTypeJS.checked) {
379 $(trPageLang).show();
380 $(trOtherLangs).show();
382 $(trContent).find("th").text("JavaScript source");
383 $(trContent).find("td").empty().append(fldJSSource);
384 $(btnPreview).hide();
386 else if (btnTypeBinary.checked) {
387 $(trPageLang).show();
388 $(trOtherLangs).show();
390 $(trContent).find("th").text("File");
391 $(trContent).find("td").empty().append(fldUploadFile).append(btnSelectFile);
392 $(btnPreview).show();
394 else if (btnTypeRedirect.checked) {
395 $(trPageLang).hide();
396 $(trOtherLangs).hide();
398 $(trContent).find("th").text("Destination Page");
399 $(trContent).find("td").empty().append(fldRedirect);
400 $(btnPreview).hide();
403 $(btnTypeRakka ).change(updateTRContent);
404 $(btnTypeCSS ).change(updateTRContent);
405 $(btnTypeJS ).change(updateTRContent);
406 $(btnTypeBinary ).change(updateTRContent);
407 $(btnTypeRedirect).change(updateTRContent);
411 = $.TABLE({className: "pageEditor"},
414 $.TH({}, "Page name"),
415 $.TD({}, fldPageName)
419 $.TH({}, "Page type"),
461 $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
466 var validate = function () {
467 var isValid = (function () {
468 if (fldPageName.value.match(Rakka.rePageName) == null) {
472 if (btnTypeRedirect.checked) {
473 if (fldRedirect.value.match(Rakka.rePageName) == null) {
478 for (var tag in otherLangs) {
479 if (otherLangs[tag].match(Rakka.rePageName) == null) {
484 if (btnTypeBinary.checked) {
485 if (uploadFileBin == "") {
494 $(btnSubmit).attr({disabled: (isValid ? "" : "disabled")});
501 .add(btnTypeRedirect)
502 .add($(trOtherLangs).find("input"))
507 $(btnSelectFile).click(validate);
510 if (oldRevision == null || oldRevision == 0) {
515 $area.append(pageEditor);
517 if (!Rakka.isLoggedIn() || Rakka.isGlobalLocked) {
518 $(trIsLocked).hide();
522 var previewRakkaPage = function (pageName, source) {
523 Rakka.displayWaitingMessage("Loading... please wait.");
525 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
529 contentType: "text/x-rakka",
532 success : function (resultDoc) {
533 Rakka.hideWaitingMessage();
534 showPreview(resultDoc);
536 error : function (req) {
537 Rakka.hideWaitingMessage();
538 alert("Error: " + req.status + " " + req.statusText);
543 var previewBinaryPage = function (pageName, data) {
544 Rakka.displayWaitingMessage("Loading... please wait.");
546 /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
547 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
551 contentType: "application/x-rakka-base64-stream",
552 data : Rakka.encodeBase64(data),
554 success : function (resultDoc) {
555 Rakka.hideWaitingMessage();
556 showPreview(resultDoc);
558 error : function (req) {
559 Rakka.hideWaitingMessage();
560 alert("Error: " + req.status + " " + req.statusText);
565 var showPreview = function (doc) {
566 $previewArea.empty();
568 $previewHeader.show();
571 var root = doc.documentElement;
572 var child = root.firstChild;
574 if (child.nodeType == 1) {
576 $previewArea.append(child.cloneNode(true));
578 } while (child = child.nextSibling);
580 Rakka.scrollToTopLeft();
584 = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) {
585 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
586 var doc = document.implementation.createDocument(NS, "page", null);
587 var page = doc.documentElement;
589 if (oldRevision != null) {
591 var updateInfo = doc.createElementNS(NS, "updateInfo");
592 updateInfo.setAttribute("oldRevision", oldRevision);
594 if (pageName != givenPageName) {
595 var move = doc.createElementNS(NS, "move");
596 move.setAttribute("from", pageName);
597 updateInfo.appendChild(move);
600 page.appendChild(updateInfo);
603 page.setAttribute("isLocked", isLocked ? "yes" : "no");
604 page.setAttribute("type", mimeType);
606 if (lang != null && lang != "") {
607 page.setAttribute("lang", lang);
610 if (summary != null && summary != "") {
611 var s = doc.createElementNS(NS, "summary");
613 doc.createTextNode(summary));
617 var oLang = doc.createElementNS(NS, "otherLang");
618 for (var tag in otherLangs) {
619 var link = doc.createElementNS(NS, "link");
620 link.setAttribute("lang", tag);
621 link.setAttribute("page", otherLangs[tag]);
622 oLang.appendChild(link);
624 page.appendChild(oLang);
626 var textData = doc.createElementNS(NS, "textData");
627 textData.appendChild(
628 doc.createTextNode(text));
630 page.appendChild(textData);
632 Rakka.displayWaitingMessage("Submitting... please wait.");
634 var url = Rakka.baseURI + encodeURI(givenPageName);
638 contentType: "text/xml",
641 beforeSend : function (req) {
642 Rakka.setAuthorization(req);
644 success : function () {
645 window.location.replace(url);
647 error : function (req) {
648 Rakka.hideWaitingMessage();
650 var $area = Rakka.switchScreen();
651 $area.text("Error: " + req.status + " " + req.statusText);
656 var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, data) {
657 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
658 var doc = document.implementation.createDocument(NS, "page", null);
659 var page = doc.documentElement;
661 if (oldRevision != null) {
663 var updateInfo = doc.createElementNS(NS, "updateInfo");
664 updateInfo.setAttribute("oldRevision", oldRevision);
666 if (pageName != givenPageName) {
667 var move = doc.createElementNS(NS, "move");
668 move.setAttribute("from", pageName);
669 updateInfo.appendChild(move);
672 page.appendChild(updateInfo);
675 page.setAttribute("isLocked", isLocked ? "yes" : "no");
676 page.setAttribute("type", "");
678 if (lang != null && lang != "") {
679 page.setAttribute("lang", lang);
682 if (summary != null) {
683 var s = doc.createElementNS(NS, "summary");
685 doc.createTextNode(summary));
689 var oLang = doc.createElementNS(NS, "otherLang");
690 for (var tag in otherLangs) {
691 var link = doc.createElementNS(NS, "link");
692 link.setAttribute("lang", tag);
693 link.setAttribute("page", otherLangs[tag]);
694 oLang.appendChild(link);
696 page.appendChild(oLang);
698 var b64 = Rakka.encodeBase64(data);
699 var binaryData = doc.createElementNS(NS, "binaryData");
700 binaryData.appendChild(
701 doc.createTextNode(b64));
703 page.appendChild(binaryData);
705 Rakka.displayWaitingMessage("Submitting... please wait.");
707 var url = Rakka.baseURI + encodeURI(givenPageName);
711 contentType: "text/xml",
714 beforeSend : function (req) {
715 Rakka.setAuthorization(req);
717 success : function () {
718 window.location.replace(url);
720 error : function (req) {
721 Rakka.hideWaitingMessage();
723 var $area = Rakka.switchScreen();
724 $area.text("Error: " + req.status + " " + req.statusText);
729 var submitRedirection = function (pageName, oldRevision, givenPageName, isLocked, destination) {
730 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
731 var doc = document.implementation.createDocument(NS, "page", null);
732 var page = doc.documentElement;
734 if (oldRevision != null) {
736 var updateInfo = doc.createElementNS(NS, "updateInfo");
737 updateInfo.setAttribute("oldRevision", oldRevision);
739 if (pageName != givenPageName) {
740 var move = doc.createElementNS(NS, "move");
741 move.setAttribute("from", pageName);
742 updateInfo.appendChild(move);
745 page.appendChild(updateInfo);
748 page.setAttribute("isLocked", isLocked ? "yes" : "no");
749 page.setAttribute("redirect", destination);
751 Rakka.displayWaitingMessage("Submitting... please wait.");
753 var url = Rakka.baseURI + encodeURI(givenPageName);
757 contentType: "text/xml",
760 beforeSend : function (req) {
761 Rakka.setAuthorization(req);
763 success : function () {
764 window.location.replace(url);
766 error : function (req) {
767 Rakka.hideWaitingMessage();
769 var $area = Rakka.switchScreen();
770 $area.text("Error: " + req.status + " " + req.statusText);
775 var deletePage = function (pageName) {
776 var url = Rakka.baseURI + encodeURI(pageName);
780 beforeSend : function (req) {
781 Rakka.setAuthorization(req);
783 success : function () {
784 window.location.replace(url);
786 error : function (req) {
787 Rakka.hideWaitingMessage();
789 var $area = Rakka.switchScreen();
790 $area.text("Error: " + req.status + " " + req.statusText);