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.find("textData").text()
41 var summary = $page.find("summary").text();
43 displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary);
46 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
49 error : function (req) {
50 Rakka.hideWaitingMessage();
52 if (req.status == 404) {
53 displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
56 $area.text("Error: " + req.status + " " + req.statusText);
62 Rakka.newPage = function () {
63 displayPageEditor("", null, "rakka", null, false, {}, null, "");
66 var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary) {
67 var $area = Rakka.switchScreen();
69 $previewHeader = $( $.H1({}, "Preview") );
70 $area.append($previewHeader);
71 $previewHeader.hide();
73 $previewArea = $( $.DIV({className: "preview"}) );
74 $area.append($previewArea);
77 $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
80 var makeDirty = function () {
85 = $.INPUT({type : "text", value: pageName});
87 $(fldPageName).change(makeDirty);
90 = $.INPUT({type : "checkbox",
91 checked : (isLocked ? "checked" : "")});
93 $(chkIsLocked).change(makeDirty);
97 $.TH({}, "Page lock"),
101 "Disallow anonymous users to edit or delete this page")));
104 = $.INPUT({type : "radio",
106 checked: (defaultType == "rakka" ? "checked" : "")});
108 $(btnTypeRakka).change(makeDirty);
111 = $.INPUT({type : "radio",
113 checked: (defaultType == "css" ? "checked" : "")});
115 $(btnTypeCSS).change(makeDirty);
118 = $.INPUT({type : "radio",
120 checked: (defaultType == "js" ? "checked" : "")});
121 $(btnTypeJS).change(makeDirty);
124 = $.INPUT({type : "radio",
126 checked: (defaultType == "binary" ? "checked" : "")});
128 $(btnTypeBinary).change(makeDirty);
131 = $.INPUT({type : "radio",
133 checked: (defaultType == "redirect" ? "checked" : "")});
135 $(btnTypeRedirect).change(makeDirty);
139 $.OPTION({value: ""}, "(unspecified)"),
143 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
145 $.OPTION({value: tag}, name));
151 $(selPageLang).change(makeDirty);
153 if (lang == null || lang == "") {
154 $(selPageLang).val($("html").attr("xml:lang"));
157 $(selPageLang).val(lang);
162 $.TH({}, "Page language"),
163 $.TD({}, selPageLang));
165 var trOtherLangs = (function () {
168 $.each(Rakka.getSystemConfig().languages, function (tag, name) {
170 $.OPTION({value: tag}, name));
173 var selLang = $.SELECT({}, options);
174 var fldLink = $.INPUT({type: "text", className: "smallField"});
176 $(selLang).change(function () {
177 var pageName = otherLangs[$(selLang).val()];
179 pageName == null ? "" : pageName
181 }).trigger("change");
183 var onLinkChanged = function () {
186 var lang = $(selLang).val();
187 var pageName = $(this).val();
189 if (pageName == "") {
190 delete otherLangs[lang];
193 otherLangs[lang] = pageName;
196 $(fldLink).change(onLinkChanged).keyup(onLinkChanged);
199 $.TH({}, "Language links"),
200 $.TD({}, selLang, fldLink));
204 = $.TEXTAREA({className: "summary"}, summary);
206 $(fldSummary).change(makeDirty);
211 $.TD({}, fldSummary));
214 = $.TEXTAREA({className: "source"},
215 (defaultType == "rakka" && source != null ? source : ""));
217 $(fldRakkaSource).change(makeDirty);
220 = $.TEXTAREA({className: "source"},
221 (defaultType == "css" && source != null ? source : ""));
223 $(fldCSSSource).change(makeDirty);
226 = $.TEXTAREA({className: "source"},
227 (defaultType == "js" && source != null ? source : ""));
229 $(fldJSSource).change(makeDirty);
232 = $.INPUT({type: "text", disabled: true});
234 = $.INPUT({type: "button", value: "Select File"});
236 $(btnSelectFile).click(function () {
237 var path = Rakka.selectFile("Select a binary file to upload", "open");
239 fldUploadFile.value = path;
245 = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
247 $(fldRedirect).change(makeDirty);
256 = $.INPUT({type: "button", value: "Preview page"});
258 $(btnPreview).click(function () {
259 if (btnTypeRakka.checked) {
261 fldPageName.value, fldRakkaSource.value);
263 else if (btnTypeBinary.checked) {
264 if (fldUploadFile.value != "") {
266 fldPageName.value, fldUploadFile.value);
272 = $.INPUT({type: "button", value: "Submit page"});
274 $(btnSubmit).click(function () {
275 if (btnTypeRakka.checked) {
282 $(selPageLang).val(),
285 fldRakkaSource.value);
287 else if (btnTypeCSS.checked) {
294 $(selPageLang).val(),
299 else if (btnTypeJS.checked) {
306 $(selPageLang).val(),
311 else if (btnTypeBinary.checked) {
312 if (fldUploadFile.value != "") {
318 $(selPageLang).val(),
321 fldUploadFile.value);
324 else if (btnTypeRedirect.checked) {
335 = $.INPUT({type: "button", value: "Delete this page"});
337 $(btnDelete).click(function () {
338 if (window.confirm("Do you really want to delete this page?")) {
339 deletePage(pageName);
344 = $.INPUT({type: "button", value: "Cancel editing"});
346 $(btnCancel).click(function () {
348 if (window.confirm("Do you really want to discard changes?")) {
349 Rakka.restoreScreen();
353 Rakka.restoreScreen();
357 var updateTRContent = function () {
358 if (btnTypeRakka.checked) {
359 $(trPageLang).show();
360 $(trOtherLangs).show();
362 $(trContent).find("th").text("Wiki source");
363 $(trContent).find("td").empty().append(fldRakkaSource);
364 $(btnPreview).show();
366 else if (btnTypeCSS.checked) {
367 $(trPageLang).show();
368 $(trOtherLangs).show();
370 $(trContent).find("th").text("CSS source");
371 $(trContent).find("td").empty().append(fldCSSSource);
372 $(btnPreview).hide();
374 else if (btnTypeJS.checked) {
375 $(trPageLang).show();
376 $(trOtherLangs).show();
378 $(trContent).find("th").text("JavaScript source");
379 $(trContent).find("td").empty().append(fldJSSource);
380 $(btnPreview).hide();
382 else if (btnTypeBinary.checked) {
383 $(trPageLang).show();
384 $(trOtherLangs).show();
386 $(trContent).find("th").text("File");
387 $(trContent).find("td").empty().append(fldUploadFile).append(btnSelectFile);
388 $(btnPreview).show();
390 else if (btnTypeRedirect.checked) {
391 $(trPageLang).hide();
392 $(trOtherLangs).hide();
394 $(trContent).find("th").text("Destination Page");
395 $(trContent).find("td").empty().append(fldRedirect);
396 $(btnPreview).hide();
399 $(btnTypeRakka ).change(updateTRContent);
400 $(btnTypeCSS ).change(updateTRContent);
401 $(btnTypeJS ).change(updateTRContent);
402 $(btnTypeBinary ).change(updateTRContent);
403 $(btnTypeRedirect).change(updateTRContent);
407 = $.TABLE({className: "pageEditor"},
410 $.TH({}, "Page name"),
411 $.TD({}, fldPageName)
415 $.TH({}, "Page type"),
457 $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
462 var validate = function () {
463 var isValid = (function () {
464 if (fldPageName.value.match(Rakka.rePageName) == null) {
468 if (btnTypeRedirect.checked) {
469 if (fldRedirect.value.match(Rakka.rePageName) == null) {
474 for (var tag in otherLangs) {
475 if (otherLangs[tag].match(Rakka.rePageName) == null) {
480 if (btnTypeBinary.checked) {
481 if (fldUploadFile.value == "") {
490 $(btnSubmit).attr({disabled: (isValid ? "" : "disabled")});
497 .add(btnTypeRedirect)
498 .add($(trOtherLangs).find("input"))
505 if (oldRevision == null || oldRevision == 0) {
510 $area.append(pageEditor);
512 if (!Rakka.isLoggedIn() || Rakka.isGlobalLocked) {
513 $(trIsLocked).hide();
517 var previewRakkaPage = function (pageName, source) {
518 Rakka.displayWaitingMessage("Loading... please wait.");
520 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
524 contentType: "text/x-rakka",
527 success : function (resultDoc) {
528 Rakka.hideWaitingMessage();
529 showPreview(resultDoc);
531 error : function (req) {
532 Rakka.hideWaitingMessage();
533 alert("Error: " + req.status + " " + req.statusText);
538 var previewBinaryPage = function (pageName, path) {
539 Rakka.displayWaitingMessage("Loading... please wait.");
541 /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
542 var bin = Rakka.loadLocalBinaryFile(path);
543 var url = Rakka.baseURI + "render/" + encodeURI(pageName);
547 contentType: "application/x-rakka-base64-stream",
548 data : Rakka.encodeBase64(bin),
550 success : function (resultDoc) {
551 Rakka.hideWaitingMessage();
552 showPreview(resultDoc);
554 error : function (req) {
555 Rakka.hideWaitingMessage();
556 alert("Error: " + req.status + " " + req.statusText);
561 var showPreview = function (doc) {
562 $previewArea.empty();
564 $previewHeader.show();
567 var root = doc.documentElement;
568 var child = root.firstChild;
570 if (child.nodeType == 1) {
572 $previewArea.append(child.cloneNode(true));
574 } while (child = child.nextSibling);
576 Rakka.scrollToTopLeft();
580 = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) {
581 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
582 var doc = document.implementation.createDocument(NS, "page", null);
583 var page = doc.documentElement;
585 if (oldRevision != null) {
587 var updateInfo = doc.createElementNS(NS, "updateInfo");
588 updateInfo.setAttribute("oldRevision", oldRevision);
590 if (pageName != givenPageName) {
591 var move = doc.createElementNS(NS, "move");
592 move.setAttribute("from", pageName);
593 updateInfo.appendChild(move);
596 page.appendChild(updateInfo);
599 page.setAttribute("isLocked", isLocked ? "yes" : "no");
600 page.setAttribute("type", mimeType);
602 if (lang != null && lang != "") {
603 page.setAttribute("lang", lang);
606 if (summary != null && summary != "") {
607 var s = doc.createElementNS(NS, "summary");
609 doc.createTextNode(summary));
613 var oLang = doc.createElementNS(NS, "otherLang");
614 for (var tag in otherLangs) {
615 var link = doc.createElementNS(NS, "link");
616 link.setAttribute("lang", tag);
617 link.setAttribute("page", otherLangs[tag]);
618 oLang.appendChild(link);
620 page.appendChild(oLang);
622 var textData = doc.createElementNS(NS, "textData");
623 textData.appendChild(
624 doc.createTextNode(text));
626 page.appendChild(textData);
628 Rakka.displayWaitingMessage("Submitting... please wait.");
630 var url = Rakka.baseURI + encodeURI(givenPageName);
634 contentType: "text/xml",
637 beforeSend : function (req) {
638 Rakka.setAuthorization(req);
640 success : function () {
641 window.location.replace(url);
643 error : function (req) {
644 Rakka.hideWaitingMessage();
646 var $area = Rakka.switchScreen();
647 $area.text("Error: " + req.status + " " + req.statusText);
652 var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, path) {
653 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
654 var doc = document.implementation.createDocument(NS, "page", null);
655 var page = doc.documentElement;
657 if (oldRevision != null) {
659 var updateInfo = doc.createElementNS(NS, "updateInfo");
660 updateInfo.setAttribute("oldRevision", oldRevision);
662 if (pageName != givenPageName) {
663 var move = doc.createElementNS(NS, "move");
664 move.setAttribute("from", pageName);
665 updateInfo.appendChild(move);
668 page.appendChild(updateInfo);
671 page.setAttribute("isLocked", isLocked ? "yes" : "no");
672 page.setAttribute("type", "");
674 if (lang != null && lang != "") {
675 page.setAttribute("lang", lang);
678 if (summary != null) {
679 var s = doc.createElementNS(NS, "summary");
681 doc.createTextNode(summary));
685 var oLang = doc.createElementNS(NS, "otherLang");
686 for (var tag in otherLangs) {
687 var link = doc.createElementNS(NS, "link");
688 link.setAttribute("lang", tag);
689 link.setAttribute("page", otherLangs[tag]);
690 oLang.appendChild(link);
692 page.appendChild(oLang);
694 var bin = Rakka.loadLocalBinaryFile(path);
695 var b64 = Rakka.encodeBase64(bin);
697 var binaryData = doc.createElementNS(NS, "binaryData");
698 binaryData.appendChild(
699 doc.createTextNode(b64));
701 page.appendChild(binaryData);
703 Rakka.displayWaitingMessage("Submitting... please wait.");
705 var url = Rakka.baseURI + encodeURI(givenPageName);
709 contentType: "text/xml",
712 beforeSend : function (req) {
713 Rakka.setAuthorization(req);
715 success : function () {
716 window.location.replace(url);
718 error : function (req) {
719 Rakka.hideWaitingMessage();
721 var $area = Rakka.switchScreen();
722 $area.text("Error: " + req.status + " " + req.statusText);
727 var submitRedirection = function (pageName, oldRevision, givenPageName, isLocked, destination) {
728 var NS = "http://cielonegro.org/schema/Rakka/Page/1.0";
729 var doc = document.implementation.createDocument(NS, "page", null);
730 var page = doc.documentElement;
732 if (oldRevision != null) {
734 var updateInfo = doc.createElementNS(NS, "updateInfo");
735 updateInfo.setAttribute("oldRevision", oldRevision);
737 if (pageName != givenPageName) {
738 var move = doc.createElementNS(NS, "move");
739 move.setAttribute("from", pageName);
740 updateInfo.appendChild(move);
743 page.appendChild(updateInfo);
746 page.setAttribute("isLocked", isLocked ? "yes" : "no");
747 page.setAttribute("redirect", destination);
749 Rakka.displayWaitingMessage("Submitting... please wait.");
751 var url = Rakka.baseURI + encodeURI(givenPageName);
755 contentType: "text/xml",
758 beforeSend : function (req) {
759 Rakka.setAuthorization(req);
761 success : function () {
762 window.location.replace(url);
764 error : function (req) {
765 Rakka.hideWaitingMessage();
767 var $area = Rakka.switchScreen();
768 $area.text("Error: " + req.status + " " + req.statusText);
773 var deletePage = function (pageName) {
774 var url = Rakka.baseURI + encodeURI(pageName);
778 beforeSend : function (req) {
779 Rakka.setAuthorization(req);
781 success : function () {
782 window.location.replace(url);
784 error : function (req) {
785 Rakka.hideWaitingMessage();
787 var $area = Rakka.switchScreen();
788 $area.text("Error: " + req.status + " " + req.statusText);