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") == "yes" ? 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 file = Rakka.selectFile("Select a binary file to upload", "open");
242 uploadFileBin = Rakka.loadLocalBinaryFile(file);
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);
347 var updateTRContent = function () {
348 if (btnTypeRakka.checked) {
349 $(trPageLang).show();
350 $(trOtherLangs).show();
352 $(trContent).find("th").text("Wiki source");
353 $(trContent).find("td").empty().append(fldRakkaSource);
354 $(btnPreview).show();
356 else if (btnTypeCSS.checked) {
357 $(trPageLang).show();
358 $(trOtherLangs).show();
360 $(trContent).find("th").text("CSS source");
361 $(trContent).find("td").empty().append(fldCSSSource);
362 $(btnPreview).hide();
364 else if (btnTypeJS.checked) {
365 $(trPageLang).show();
366 $(trOtherLangs).show();
368 $(trContent).find("th").text("JavaScript source");
369 $(trContent).find("td").empty().append(fldJSSource);
370 $(btnPreview).hide();
372 else if (btnTypeBinary.checked) {
373 $(trPageLang).show();
374 $(trOtherLangs).show();
376 $(trContent).find("th").text("File");
377 $(trContent).find("td").empty().append(fldUploadFile).append(btnSelectFile);
378 $(btnPreview).show();
380 else if (btnTypeRedirect.checked) {
381 $(trPageLang).hide();
382 $(trOtherLangs).hide();
384 $(trContent).find("th").text("Destination Page");
385 $(trContent).find("td").empty().append(fldRedirect);
386 $(btnPreview).hide();
389 $(btnTypeRakka ).change(updateTRContent);
390 $(btnTypeCSS ).change(updateTRContent);
391 $(btnTypeJS ).change(updateTRContent);
392 $(btnTypeBinary ).change(updateTRContent);
393 $(btnTypeRedirect).change(updateTRContent);
397 = $.TABLE({className: "pageEditor"},
400 $.TH({}, "Page name"),
401 $.TD({}, fldPageName)
405 $.TH({}, "Page type"),
447 $.TD({}, btnPreview, btnSubmit, btnDelete)
452 var validate = function () {
453 var isValid = (function () {
454 if (fldPageName.value.match(Rakka.rePageName) == null) {
458 if (btnTypeRedirect.checked) {
459 if (fldRedirect.value.match(Rakka.rePageName) == null) {
464 for (var tag in otherLangs) {
465 if (otherLangs[tag].match(Rakka.rePageName) == null) {
470 if (btnTypeBinary.checked) {
471 if (uploadFileBin == "") {
480 $(btnSubmit).attr({disabled: (isValid ? "" : "disabled")});
487 .add(btnTypeRedirect)
488 .add($(trOtherLangs).find("input"))
493 $(btnSelectFile).click(validate);
496 if (oldRevision == null || oldRevision == 0) {
501 $area.append(pageEditor);
503 if (!Rakka.isLoggedIn() || Rakka.isGlobalLocked) {
504 $(trIsLocked).hide();
508 var previewRakkaPage = function (pageName, source) {
509 Rakka.displayWaitingMessage("Loading... please wait.");
511 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
515 contentType: "text/x-rakka",
518 success : function (resultDoc) {
519 Rakka.hideWaitingMessage();
520 showPreview(resultDoc);
522 error : function (req) {
523 Rakka.hideWaitingMessage();
524 alert("Error: " + req.status + " " + req.statusText);
529 var previewBinaryPage = function (pageName, data) {
530 Rakka.displayWaitingMessage("Loading... please wait.");
532 /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
533 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
537 contentType: "application/x-rakka-base64-stream",
538 data : Rakka.encodeBase64(data),
540 success : function (resultDoc) {
541 Rakka.hideWaitingMessage();
542 showPreview(resultDoc);
544 error : function (req) {
545 Rakka.hideWaitingMessage();
546 alert("Error: " + req.status + " " + req.statusText);
551 var showPreview = function (doc) {
552 $previewArea.empty();
554 $previewHeader.show();
557 var root = doc.documentElement;
558 var child = root.firstChild;
560 if (child.nodeType == 1) {
562 $previewArea.append(child.cloneNode(true));
564 } while (child = child.nextSibling);
566 Rakka.scrollToTopLeft();
570 = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) {
571 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
572 var doc = document.implementation.createDocument(NS, "page", null);
573 var page = doc.documentElement;
575 if (oldRevision != null) {
577 var updateInfo = doc.createElementNS(NS, "updateInfo");
578 updateInfo.setAttribute("oldRevision", oldRevision);
580 if (pageName != givenPageName) {
581 var move = doc.createElementNS(NS, "move");
582 move.setAttribute("from", pageName);
583 updateInfo.appendChild(move);
586 page.appendChild(updateInfo);
589 page.setAttribute("isLocked", isLocked ? "yes" : "no");
590 page.setAttribute("type", mimeType);
592 if (lang != null && lang != "") {
593 page.setAttribute("lang", lang);
596 if (summary != null && summary != "") {
597 var s = doc.createElementNS(NS, "summary");
599 doc.createTextNode(summary));
603 var oLang = doc.createElementNS(NS, "otherLang");
604 for (var tag in otherLangs) {
605 var link = doc.createElementNS(NS, "link");
606 link.setAttribute("lang", tag);
607 link.setAttribute("page", otherLangs[tag]);
608 oLang.appendChild(link);
610 page.appendChild(oLang);
612 var textData = doc.createElementNS(NS, "textData");
613 textData.appendChild(
614 doc.createTextNode(text));
616 page.appendChild(textData);
618 Rakka.displayWaitingMessage("Submitting... please wait.");
620 var url = Rakka.baseURI + encodeURI(givenPageName);
624 contentType: "text/xml",
627 beforeSend : function (req) {
628 Rakka.setAuthorization(req);
630 success : function () {
631 window.location.replace(url);
633 error : function (req) {
634 Rakka.hideWaitingMessage();
636 var $area = Rakka.switchScreen();
637 $area.text("Error: " + req.status + " " + req.statusText);
642 var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, data) {
643 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
644 var doc = document.implementation.createDocument(NS, "page", null);
645 var page = doc.documentElement;
647 if (oldRevision != null) {
649 var updateInfo = doc.createElementNS(NS, "updateInfo");
650 updateInfo.setAttribute("oldRevision", oldRevision);
652 if (pageName != givenPageName) {
653 var move = doc.createElementNS(NS, "move");
654 move.setAttribute("from", pageName);
655 updateInfo.appendChild(move);
658 page.appendChild(updateInfo);
661 page.setAttribute("isLocked", isLocked ? "yes" : "no");
662 page.setAttribute("type", "");
664 if (lang != null && lang != "") {
665 page.setAttribute("lang", lang);
668 if (summary != null) {
669 var s = doc.createElementNS(NS, "summary");
671 doc.createTextNode(summary));
675 var oLang = doc.createElementNS(NS, "otherLang");
676 for (var tag in otherLangs) {
677 var link = doc.createElementNS(NS, "link");
678 link.setAttribute("lang", tag);
679 link.setAttribute("page", otherLangs[tag]);
680 oLang.appendChild(link);
682 page.appendChild(oLang);
684 var b64 = Rakka.encodeBase64(data);
685 var binaryData = doc.createElementNS(NS, "binaryData");
686 binaryData.appendChild(
687 doc.createTextNode(b64));
689 page.appendChild(binaryData);
691 Rakka.displayWaitingMessage("Submitting... please wait.");
693 var url = Rakka.baseURI + encodeURI(givenPageName);
697 contentType: "text/xml",
700 beforeSend : function (req) {
701 Rakka.setAuthorization(req);
703 success : function () {
704 window.location.replace(url);
706 error : function (req) {
707 Rakka.hideWaitingMessage();
709 var $area = Rakka.switchScreen();
710 $area.text("Error: " + req.status + " " + req.statusText);
715 var submitRedirection = function (pageName, oldRevision, givenPageName, isLocked, destination) {
716 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
717 var doc = document.implementation.createDocument(NS, "page", null);
718 var page = doc.documentElement;
720 if (oldRevision != null) {
722 var updateInfo = doc.createElementNS(NS, "updateInfo");
723 updateInfo.setAttribute("oldRevision", oldRevision);
725 if (pageName != givenPageName) {
726 var move = doc.createElementNS(NS, "move");
727 move.setAttribute("from", pageName);
728 updateInfo.appendChild(move);
731 page.appendChild(updateInfo);
734 page.setAttribute("isLocked", isLocked ? "yes" : "no");
735 page.setAttribute("redirect", destination);
737 Rakka.displayWaitingMessage("Submitting... please wait.");
739 var url = Rakka.baseURI + encodeURI(givenPageName);
743 contentType: "text/xml",
746 beforeSend : function (req) {
747 Rakka.setAuthorization(req);
749 success : function () {
750 window.location.replace(url);
752 error : function (req) {
753 Rakka.hideWaitingMessage();
755 var $area = Rakka.switchScreen();
756 $area.text("Error: " + req.status + " " + req.statusText);
761 var deletePage = function (pageName) {
762 var url = Rakka.baseURI + encodeURI(pageName);
766 beforeSend : function (req) {
767 Rakka.setAuthorization(req);
769 success : function () {
770 window.location.replace(url);
772 error : function (req) {
773 Rakka.hideWaitingMessage();
775 var $area = Rakka.switchScreen();
776 $area.text("Error: " + req.status + " " + req.statusText);