]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - js/editPage.js
implemented language link editor (partly)
[Rakka.git] / js / editPage.js
index 4623849dec6e35fde133d2e10be86ec79d962854..e390a1949ec67a7cf8c7e2b8f8b698887409f82e 100644 (file)
-Rakka.editPage = function (pageName) {
-    var $area = Rakka.switchScreen();
+(function () {
 
-    Rakka.displayWaitingMessage("Loading... please wait.");
+    var $previewHeader = null;
+    var $previewArea   = null;
+
+    var isDirty = null;
+
+    Rakka.editPage = function (pageName) {
+        var $area = Rakka.switchScreen();
+
+        Rakka.displayWaitingMessage("Loading... please wait.");
     
-    // XML 版のページを取得する。
-    $.ajax({
-        url    : Rakka.baseURI + pageName + ".xml",
-        success: function (pageXml) {
-            Rakka.hideWaitingMessage();
-            
-            var $page       = $(pageXml).find("page");
-            var oldRevision = $page.attr("revision");
-            var defaultType
-                = $page.attr("isBinary") == "yes"          ? "binary"
-                : $page.attr("type")     == "text/x-rakka" ? "rakka"
-                : $page.attr("type")     == "text/css"     ? "css"
-                : $page.attr("redirect") != null           ? "redirect"
-                :                                            "unknown"
-                ;
-            var source
-                = $page.attr("redirect") != null ? $page.attr("redirect")
-                : $page.find("textData").text()
-                ;
-            Rakka.displayPageEditor(pageName, oldRevision, defaultType, source);
-        },
-        error  : function (req) {
-            Rakka.hideWaitingMessage();
-            
-            if (req.status == 404) {
-                Rakka.displayPageEditor(pageName, null, "rakka", null);
-            }
-            else {
-                $area.text("Error: " + req.status + " " + req.statusText);
+        // XML 版のページを取得する。
+        $.ajax({
+            url    : Rakka.baseURI + pageName + ".xml",
+            success: function (pageXml) {
+                Rakka.hideWaitingMessage();
+
+                if (pageXml.documentElement.tagName == "page") {
+                    var $page       = $(pageXml).find("page");
+                    var oldRevision = $page.attr("revision");
+                    var defaultType
+                        = $page.attr("isBinary") == "yes"          ? "binary"
+                        : $page.attr("type")     == "text/x-rakka" ? "rakka"
+                        : $page.attr("type")     == "text/css"     ? "css"
+                        : $page.attr("redirect") != null           ? "redirect"
+                        :                                            "unknown"
+                        ;
+                    var lang        = $page.attr("lang");
+                    var isLocked    = $page.attr("isLocked") == "yes";
+                    var otherLangs  = (function () {
+                        var obj = {};
+                        $page.find("otherLang > link").each(function () {
+                            obj[this.getAttribute("lang")] = this.getAttribute("page");
+                        });
+                        return obj;
+                    })();
+                    var source
+                        = $page.attr("redirect") != null ? $page.attr("redirect")
+                        : $page.find("textData").text()
+                        ;
+                    var summary     = $page.find("summary").text();
+                
+                    displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary);
+                }
+                else {
+                    displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
+                }
+            },
+            error  : function (req) {
+                Rakka.hideWaitingMessage();
+                
+                if (req.status == 404) {
+                    displayPageEditor(pageName, null, "rakka", null, false, {}, null, "");
+                }
+                else {
+                    $area.text("Error: " + req.status + " " + req.statusText);
+                }
             }
+        });
+    };
+
+    Rakka.newPage = function () {
+        displayPageEditor("", null, "rakka", null, false, {}, null, "");
+    };
+
+    var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary) {
+        var $area = Rakka.switchScreen();
+
+        $previewHeader = $( $.H1({}, "Preview") );
+        $area.append($previewHeader);
+        $previewHeader.hide();
+
+        $previewArea = $( $.DIV({className: "preview"}) );
+        $area.append($previewArea);
+        $previewArea.hide();
+
+        $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
+
+        var makeDirty = function () {
+            isDirty = true;
+        };
+    
+        var fldPageName
+            = $.INPUT({type : "text", value: pageName});
+
+        $(fldPageName).change(makeDirty);
+
+        var chkIsLocked
+            = $.INPUT({type    : "checkbox",
+                       checked : (isLocked ? "checked" : "")});
+
+        $(chkIsLocked).change(makeDirty);
+
+        var trIsLocked
+            = $.TR({},
+                   $.TH({}, "Page lock"),
+                   $.TD({},
+                        $.LABEL({},
+                                chkIsLocked,
+                                "Disallow anonymous users to edit or delete this page")));
+        
+        var btnTypeRakka
+            = $.INPUT({type   : "radio",
+                       name   : "type",
+                       checked: (defaultType == "rakka"    ? "checked" : "")});
+
+        $(btnTypeRakka).change(makeDirty);
+
+        var btnTypeCSS
+            = $.INPUT({type   : "radio",
+                       name   : "type",
+                       checked: (defaultType == "css"      ? "checked" : "")});
+
+        $(btnTypeCSS).change(makeDirty);
+
+        var btnTypeBinary
+            = $.INPUT({type   : "radio",
+                       name   : "type",
+                       checked: (defaultType == "binary"   ? "checked" : "")});
+
+        $(btnTypeBinary).change(makeDirty);
+
+        var btnTypeRedirect
+            = $.INPUT({type   : "radio",
+                       name   : "type",
+                       checked: (defaultType == "redirect" ? "checked" : "")});
+
+        $(btnTypeRedirect).change(makeDirty);
+
+        var selPageLang
+            = $.SELECT({},
+                       $.OPTION({value: ""}, "(unspecified)"),
+                       (function () {
+                           var options = [];
+                           
+                           $.each(Rakka.getSystemConfig().languages, function (tag, name) {
+                               options.push(
+                                   $.OPTION({value: tag}, name));
+                           });
+
+                           return options;
+                       })());
+
+        $(selPageLang).change(makeDirty);
+
+        if (lang == null || lang == "") {
+            $(selPageLang).val($("html").attr("xml:lang"));
+        }
+        else {
+            $(selPageLang).val(lang);
         }
-    });
-};
 
-Rakka.newPage = function () {
-    Rakka.displayPageEditor("", null, "rakka", null);
-};
+        var trPageLang
+            = $.TR({},
+                   $.TH({}, "Page language"),
+                   $.TD({}, selPageLang));
+
+        var trOtherLangs = (function () {
+            var options = [];
+
+            $.each(Rakka.getSystemConfig().languages, function (tag, name) {
+                options.push(
+                    $.OPTION({value: tag}, name));
+            });
+
+            var selLang = $.SELECT({}, options);
+            var fldLink = $.INPUT({type: "text", className: "smallField"});
+
+            $(selLang).change(function () {
+                var pageName = otherLangs[$(selLang).val()];
+                $(fldLink).val(
+                    pageName == null ? "" : pageName
+                );
+            }).trigger("change");
+
+            var onLinkChanged = function () {
+                isDirty = true;
+
+                var lang     = $(selLang).val();
+                var pageName = $(this).val();
+                
+                if (pageName == "") {
+                    delete otherLangs[lang];
+                }
+                else {
+                    otherLangs[lang] = pageName;
+                }
+            };
+            $(fldLink).change(onLinkChanged).keyup(onLinkChanged);
+
+            return $.TR({},
+                        $.TH({}, "Language links"),
+                        $.TD({}, selLang, fldLink));
+        })();
+
+        var fldSummary
+            = $.TEXTAREA({className: "summary"}, summary);
+
+        $(fldSummary).change(makeDirty);
+
+        var trSummary
+            = $.TR({},
+                   $.TH({}, "Summary"),
+                   $.TD({}, fldSummary));
+
+        var fldRakkaSource
+            = $.TEXTAREA({className: "source"},
+                         (defaultType == "rakka" && source != null ? source : ""));
+
+        $(fldRakkaSource).change(makeDirty);
+
+        var fldCSSSource
+            = $.TEXTAREA({className: "source"},
+                         (defaultType == "css"   && source != null ? source : ""));
+
+        $(fldCSSSource).change(makeDirty);
+
+        var fldUploadFile
+            = $.INPUT({type: "file"});
+
+        $(fldUploadFile).change(makeDirty);
+
+        var fldRedirect
+            = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
+
+        $(fldRedirect).change(makeDirty);
+
+        var trContent
+            = $.TR({}, 
+                   $.TH({}),
+                   $.TD({})
+                  );
+
+        var btnPreview
+            = $.INPUT({type: "button", value: "Preview page"});
+        
+        $(btnPreview).click(function () {
+            if (btnTypeRakka.checked) {
+                previewRakkaPage(
+                    fldPageName.value, fldRakkaSource.value);
+            }
+            else if (btnTypeBinary.checked) {
+                previewBinaryPage(
+                    fldPageName.value, fldUploadFile.value);
+            }
+        });
+
+        var btnSubmit
+            = $.INPUT({type: "button", value: "Submit page"});
+        
+        $(btnSubmit).click(function () {
+            if (btnTypeRakka.checked) {
+                submitTextPage(
+                    pageName,
+                    oldRevision,
+                    fldPageName.value,
+                    chkIsLocked.checked,
+                    "text/x-rakka",
+                    $(selPageLang).val(),
+                    otherLangs,
+                    fldSummary.value,
+                    fldRakkaSource.value);
+            }
+            else if (btnTypeCSS.checked) {
+                submitTextPage(
+                    pageName,
+                    oldRevision,
+                    fldPageName.value,
+                    chkIsLocked.checked,
+                    "text/css",
+                    $(selPageLang).val(),
+                    otherLangs,
+                    fldSummary.value,
+                    fldCSSSource.value);
+            }
+            else if (btnTypeBinary.checked) {
+                submitBinaryPage(
+                    pageName,
+                    oldRevision,
+                    fldPageName.value,
+                    chkIsLocked.checked,
+                    $(selPageLang).val(),
+                    otherLangs,
+                    fldSummary.value,
+                    fldUploadFile.value);
+            }
+            else if (btnTypeRedirect.checked) {
+                submitRedirection(
+                    pageName,
+                    oldRevision,
+                    fldPageName.value,
+                    chkIsLocked.checked,
+                    fldRedirect.value);
+            }
+        });
+
+        var btnDelete
+            = $.INPUT({type: "button", value: "Delete this page"});
+        
+        $(btnDelete).click(function () {
+            if (window.confirm("Do you really want to delete this page?")) {
+                deletePage(pageName);
+            }
+        });
 
-Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source) {
-    var $area = Rakka.switchScreen();
-    $area.empty();
+        var btnCancel
+            = $.INPUT({type: "button", value: "Cancel editing"});
 
-    $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page"));
+        $(btnCancel).click(function () {
+            if (isDirty) {
+                if (window.confirm("Do you really want to discard changes?")) {
+                    Rakka.restoreScreen();
+                }
+            }
+            else {
+                Rakka.restoreScreen();
+            }
+        });
+
+        var updateTRContent = function () {
+            if (btnTypeRakka.checked) {
+                $(trPageLang).show();
+                $(trOtherLangs).show();
+                $(trSummary).show();
+                $(trContent).find("th").text("Wiki source");
+                $(trContent).find("td").empty().append(fldRakkaSource);
+                $(btnPreview).show();
+            }
+            else if (btnTypeCSS.checked) {
+                $(trPageLang).show();
+                $(trOtherLangs).show();
+                $(trSummary).show();
+                $(trContent).find("th").text("CSS source");
+                $(trContent).find("td").empty().append(fldCSSSource);
+                $(btnPreview).hide();
+            }
+            else if (btnTypeBinary.checked) {
+                $(trPageLang).show();
+                $(trOtherLangs).show();
+                $(trSummary).show();
+                $(trContent).find("th").text("File");
+                $(trContent).find("td").empty().append(fldUploadFile);
+                $(btnPreview).show();
+            }
+            else if (btnTypeRedirect.checked) {
+                $(trPageLang).hide();
+                $(trOtherLangs).hide();
+                $(trSummary).hide();
+                $(trContent).find("th").text("Destination Page");
+                $(trContent).find("td").empty().append(fldRedirect);
+                $(btnPreview).hide();
+            }
+        };
+        $(btnTypeRakka   ).change(updateTRContent);
+        $(btnTypeCSS     ).change(updateTRContent);
+        $(btnTypeBinary  ).change(updateTRContent);
+        $(btnTypeRedirect).change(updateTRContent);
+        updateTRContent();
+
+        var pageEditor
+            = $.TABLE({className: "pageEditor"},
+                      $.TBODY({},
+                              $.TR({},
+                                   $.TH({}, "Page name"),
+                                   $.TD({}, fldPageName)
+                                  ),
+                              trIsLocked,
+                              $.TR({},
+                                   $.TH({}, "Page type"),
+                                   $.TD({},
+                                        $.UL({},
+                                             $.LI({},
+                                                  $.LABEL({},
+                                                          btnTypeRakka,
+                                                          "Wiki page"
+                                                         )
+                                                 ),
+                                             $.LI({},
+                                                  $.LABEL({},
+                                                          btnTypeCSS,
+                                                          "Style sheet"
+                                                         )
+                                                 ),
+                                             $.LI({},
+                                                  $.LABEL({},
+                                                          btnTypeBinary,
+                                                          "Binary file"
+                                                         )
+                                                 ),
+                                             $.LI({},
+                                                  $.LABEL({},
+                                                          btnTypeRedirect,
+                                                          "Redirection"
+                                                         )
+                                                 )
+                                            )
+                                       )
+                                  ),
+                              trPageLang,
+                              trOtherLangs,
+                              trSummary,
+                              trContent,
+                              $.TR({},
+                                   $.TH({}),
+                                   $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
+                                  )
+                             )
+                     );
+
+        if (oldRevision == null || oldRevision == 0) {
+            // 削除不可
+            $(btnDelete).hide();
+        }
 
-    var fldPageName
-        = $.INPUT({type : "text", value: pageName});
+        $area.append(pageEditor);
 
-    var btnTypeRakka
-        = $.INPUT({type   : "radio",
-                   name   : "type",
-                   checked: (defaultType == "rakka"    ? "checked" : "")});
+        if (!Rakka.isLoggedIn() || Rakka.isGlobalLocked) {
+            $(trIsLocked).hide();
+        }
 
-    var btnTypeCSS
-        = $.INPUT({type   : "radio",
-                   name   : "type",
-                   checked: (defaultType == "css"      ? "checked" : "")});
+        isDirty = false;
+    };
 
-    var btnTypeBinary
-        = $.INPUT({type   : "radio",
-                   name   : "type",
-                   checked: (defaultType == "binary"   ? "checked" : "")});
+    var previewRakkaPage = function (pageName, source) {
+        Rakka.displayWaitingMessage("Loading... please wait.");
+        
+        var url = Rakka.baseURI + "render/" + encodeURI(pageName);
+        $.ajax({
+            type       : "POST",
+            url        : url,
+            contentType: "text/x-rakka",
+            data       : source,
+            processData: false,
+            success    : function (resultDoc) {
+                Rakka.hideWaitingMessage();
+                showPreview(resultDoc);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                alert("Error: " + req.status + " " + req.statusText);
+            }
+        });
+    };
 
-    var btnTypeRedirect
-        = $.INPUT({type   : "radio",
-                   name   : "type",
-                   checked: (defaultType == "redirect" ? "checked" : "")});
+    var previewBinaryPage = function (pageName, path) {
+        Rakka.displayWaitingMessage("Loading... please wait.");
+
+        /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/
+        var bin = Rakka.loadLocalBinaryFile(path);
+        var url = Rakka.baseURI + "render/" + encodeURI(pageName);
+        $.ajax({
+            type       : "POST",
+            url        : url,
+            contentType: "application/x-rakka-base64-stream",
+            data       : Rakka.encodeBase64(bin),
+            processData: false,
+            success    : function (resultDoc) {
+                Rakka.hideWaitingMessage();
+                showPreview(resultDoc);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                alert("Error: " + req.status + " " + req.statusText);
+            }
+        });
+    };
 
-    var fldRakkaSource
-        = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : ""));
+    var showPreview = function (doc) {
+        $previewArea.empty();
+        
+        $previewHeader.show();
+        $previewArea.show();
+        
+        var root  = doc.documentElement;
+        var child = root.firstChild;
+        do {
+            if (child.nodeType == 1) {
+                // 要素だったので複製
+                $previewArea.append(child.cloneNode(true));
+            }
+        } while (child = child.nextSibling);
 
-    var fldCSSSource
-        = $.TEXTAREA({}, (defaultType == "css"   && source != null ? source : ""));
+        Rakka.scrollToTopLeft();
+    };
 
-    var fldUploadFile
-        = $.INPUT({type: "file"});
+    var submitTextPage = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) {
+        var doc = document.implementation.createDocument(
+            "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
 
-    var fldRedirect
-        = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
+        var page = doc.documentElement;
 
-    var trContent
-        = $.TR({}, 
-               $.TH({}),
-               $.TD({})
-              );
+        if (oldRevision != null) {
+            // ページ書換時
+            var updateInfo = doc.createElement("updateInfo");
+            updateInfo.setAttribute("oldRevision", oldRevision);
 
-    var btnPreview
-        = $.INPUT({type: "button", value: "Preview page"});
-    
-    $(btnPreview).click(function () {
-        throw new Error("FIXME: not implemented yet");
-    });
+            if (pageName != givenPageName) {
+                var move = doc.createElement("move");
+                move.setAttribute("from", pageName);
+                updateInfo.appendChild(move);
+            }
 
-    var btnSubmit
-        = $.INPUT({type: "button", value: "Submit page"});
-    
-    $(btnSubmit).click(function () {
-        if (btnTypeRakka.checked) {
-            Rakka.submitTextPage(
-                pageName,
-                oldRevision,
-                fldPageName.value,
-                "text/x-rakka",
-                fldRakkaSource.value);
+            page.appendChild(updateInfo);
         }
-        else if (btnTypeCSS.checked) {
-            Rakka.submitTextPage(
-                pageName,
-                oldRevision,
-                fldPageName.value,
-                "text/css",
-                fldCSSSource.value);
+
+        page.setAttribute("isLocked", isLocked ? "yes" : "no");
+        page.setAttribute("type", mimeType);
+
+        if (lang != null && lang != "") {
+            page.setAttribute("lang", lang);
         }
-        else if (btnTypeBinary.checked) {
-            Rakka.submitBinaryPage(
-                pageName,
-                oldRevision,
-                fldPageName.value,
-                fldUploadFile.value);
+
+        if (summary != null && summary != "") {
+            var s = doc.createElement("summary");
+            s.appendChild(
+                doc.createTextNode(summary));
+            page.appendChild(s);
         }
-        else if (btnTypeRedirect.checked) {
-            Rakka.submitRedirection(
-                pageName,
-                oldRevision,
-                fldPageName.value,
-                fldRedirect.value);
+
+        var oLang = doc.createElement("otherLang");
+        for (var tag in otherLangs) {
+            var link = doc.createElement("link");
+            link.setAttribute("lang", tag);
+            link.setAttribute("page", otherLangs[tag]);
+            oLang.appendChild(link);
         }
-    });
+        page.appendChild(oLang);
+
+        var textData = doc.createElement("textData");
+        textData.appendChild(
+            doc.createTextNode(text));
+
+        page.appendChild(textData);
+
+        Rakka.displayWaitingMessage("Submitting... please wait.");
+
+        var url = Rakka.baseURI + encodeURI(givenPageName);
+        $.ajax({
+            type       : "PUT",
+            url        : url,
+            contentType: "text/xml",
+            data       : doc,
+            processData: false,
+            beforeSend : function (req) {
+                Rakka.setAuthorization(req);
+            },
+            success    : function () {
+                window.location.replace(url);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                
+                var $area = Rakka.switchScreen();
+                $area.text("Error: " + req.status + " " + req.statusText);
+            }
+        });
+    };
 
-    var btnDelete
-        = $.INPUT({type: "button", value: "Delete this page"});
-    
-    $(btnDelete).click(function () {
-        throw new Error("FIXME: not implemented yet");
-    });
-
-    var updateTRContent = function () {
-        if (btnTypeRakka.checked) {
-            $(trContent).find("th").text("Wiki source");
-            $(trContent).find("td").empty().append(fldRakkaSource);
-            $(btnPreview).show();
+    var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, path) {
+        var doc = document.implementation.createDocument(
+            "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
+
+        var page = doc.documentElement;
+
+        if (oldRevision != null) {
+            // ページ書換時
+            var updateInfo = doc.createElement("updateInfo");
+            updateInfo.setAttribute("oldRevision", oldRevision);
+
+            if (pageName != givenPageName) {
+                var move = doc.createElement("move");
+                move.setAttribute("from", pageName);
+                updateInfo.appendChild(move);
+            }
+
+            page.appendChild(updateInfo);
         }
-        else if (btnTypeCSS.checked) {
-            $(trContent).find("th").text("CSS source");
-            $(trContent).find("td").empty().append(fldCSSSource);
-            $(btnPreview).hide();
+
+        page.setAttribute("isLocked", isLocked ? "yes" : "no");
+        page.setAttribute("type", "");
+
+        if (lang != null && lang != "") {
+            page.setAttribute("lang", lang);
         }
-        else if (btnTypeBinary.checked) {
-            $(trContent).find("th").text("File");
-            $(trContent).find("td").empty().append(fldUploadFile);
-            $(btnPreview).show();
+
+        if (summary != null) {
+            var s = doc.createElement("summary");
+            s.appendChild(
+                doc.createTextNode(summary));
+            page.appendChild(s);
         }
-        else if (btnTypeRedirect.checked) {
-            $(trContent).find("th").text("Destination Page");
-            $(trContent).find("td").empty().append(fldRedirect);
-            $(btnPreview).hide();
+
+        var oLang = doc.createElement("otherLang");
+        for (var tag in otherLangs) {
+            var link = doc.createElement("link");
+            link.setAttribute("lang", tag);
+            link.setAttribute("page", otherLangs[tag]);
+            oLang.appendChild(link);
         }
+        page.appendChild(oLang);
+
+        var bin = Rakka.loadLocalBinaryFile(path);
+        var b64 = Rakka.encodeBase64(bin);
+
+        var binaryData = doc.createElement("binaryData");
+        binaryData.appendChild(
+            doc.createTextNode(b64));
+
+        page.appendChild(binaryData);
+
+        Rakka.displayWaitingMessage("Submitting... please wait.");
+
+        var url = Rakka.baseURI + encodeURI(givenPageName);
+        $.ajax({
+            type       : "PUT",
+            url        : url,
+            contentType: "text/xml",
+            data       : doc,
+            processData: false,
+            beforeSend : function (req) {
+                Rakka.setAuthorization(req);
+            },
+            success    : function () {
+                window.location.replace(url);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                
+                var $area = Rakka.switchScreen();
+                $area.text("Error: " + req.status + " " + req.statusText);
+            }
+        });
     };
-    $(btnTypeRakka   ).change(updateTRContent);
-    $(btnTypeCSS     ).change(updateTRContent);
-    $(btnTypeBinary  ).change(updateTRContent);
-    $(btnTypeRedirect).change(updateTRContent);
-    updateTRContent();
-
-    var pageEditor
-        = $.TABLE({className: "pageEditor"},
-                  $.TBODY({},
-                          $.TR({},
-                               $.TH({}, "Page name"),
-                               $.TD({}, fldPageName)
-                              ),
-                          $.TR({},
-                               $.TH({}, "Page type"),
-                               $.TD({},
-                                    $.UL({},
-                                         $.LI({},
-                                              $.LABEL({},
-                                                      btnTypeRakka,
-                                                      "Wiki page"
-                                                     )
-                                             ),
-                                         $.LI({},
-                                              $.LABEL({},
-                                                      btnTypeCSS,
-                                                      "Style sheet"
-                                                     )
-                                             ),
-                                         $.LI({},
-                                              $.LABEL({},
-                                                      btnTypeBinary,
-                                                      "Binary file"
-                                                     )
-                                             ),
-                                         $.LI({},
-                                              $.LABEL({},
-                                                      btnTypeRedirect,
-                                                      "Redirection"
-                                                     )
-                                             )
-                                        )
-                                   )
-                              ),
-                          trContent,
-                          $.TR({},
-                               $.TH({}),
-                               $.TD({}, btnPreview, btnSubmit, btnDelete)
-                              )
-                         )
-                 );
-
-    if (oldRevision == null || oldRevision == 0) {
-        // 削除不可
-        $(btnDelete).hide();
-    }
-
-    $area.append(pageEditor);
-};
-
-Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
-    var doc = document.implementation.createDocument(
-        "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
-
-    var page = doc.documentElement;
-
-    if (oldRevision != null) {
-        // ページ書換時
-        var updateInfo = doc.createElement("updateInfo");
-        updateInfo.setAttribute("oldRevision", oldRevision);
-
-        if (pageName != givenPageName) {
-            var move = doc.createElement("move");
-            move.setAttribute("from", pageName);
-            updateInfo.appendChild(move);
-        }
 
-        page.appendChild(updateInfo);
-    }
-
-    page.setAttribute("type", mimeType);
-
-    var textData = doc.createElement("textData");
-    textData.appendChild(
-        doc.createTextNode(text));
-
-    page.appendChild(textData);
-
-    Rakka.displayWaitingMessage("Submitting... please wait.");
-
-    var url = Rakka.baseURI + encodeURI(givenPageName);
-    $.ajax({
-        type       : "PUT",
-        url        : url,
-        contentType: "text/xml",
-        data       : doc,
-        processData: false,
-        success    : function () {
-            window.location.replace(url);
-        },
-        error      : function (req) {
-            Rakka.hideWaitingMessage();
-            
-            var $area = Rakka.switchScreen();
-            $area.text("Error: " + req.status + " " + req.statusText);
-        }
-    });
-};
+    var submitRedirection = function (pageName, oldRevision, givenPageName, isLocked, destination) {
+        var doc = document.implementation.createDocument(
+            "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
 
-Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destination) {
-    var doc = document.implementation.createDocument(
-        "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
+        var page = doc.documentElement;
 
-    var page = doc.documentElement;
+        if (oldRevision != null) {
+            // ページ書換時
+            var updateInfo = doc.createElement("updateInfo");
+            updateInfo.setAttribute("oldRevision", oldRevision);
 
-    if (oldRevision != null) {
-        // ページ書換時
-        var updateInfo = doc.createElement("updateInfo");
-        updateInfo.setAttribute("oldRevision", oldRevision);
+            if (pageName != givenPageName) {
+                var move = doc.createElement("move");
+                move.setAttribute("from", pageName);
+                updateInfo.appendChild(move);
+            }
 
-        if (pageName != givenPageName) {
-            var move = doc.createElement("move");
-            move.setAttribute("from", pageName);
-            updateInfo.appendChild(move);
+            page.appendChild(updateInfo);
         }
 
-        page.appendChild(updateInfo);
-    }
-
-    page.setAttribute("redirect", destination);
-
-    Rakka.displayWaitingMessage("Submitting... please wait.");
-
-    var url = Rakka.baseURI + encodeURI(givenPageName);
-    $.ajax({
-        type       : "PUT",
-        url        : url,
-        contentType: "text/xml",
-        data       : doc,
-        processData: false,
-        success    : function () {
-            window.location.replace(url);
-        },
-        error      : function (req) {
-            Rakka.hideWaitingMessage();
-            
-            var $area = Rakka.switchScreen();
-            $area.text("Error: " + req.status + " " + req.statusText);
-        }
-    });
-};
\ No newline at end of file
+        page.setAttribute("isLocked", isLocked ? "yes" : "no");
+        page.setAttribute("redirect", destination);
+
+        Rakka.displayWaitingMessage("Submitting... please wait.");
+
+        var url = Rakka.baseURI + encodeURI(givenPageName);
+        $.ajax({
+            type       : "PUT",
+            url        : url,
+            contentType: "text/xml",
+            data       : doc,
+            processData: false,
+            beforeSend : function (req) {
+                Rakka.setAuthorization(req);
+            },
+            success    : function () {
+                window.location.replace(url);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                
+                var $area = Rakka.switchScreen();
+                $area.text("Error: " + req.status + " " + req.statusText);
+            }
+        });
+    };
+
+    var deletePage = function (pageName) {
+        var url = Rakka.baseURI + encodeURI(pageName);
+        $.ajax({
+            type       : "DELETE",
+            url        : url,
+            beforeSend : function (req) {
+                Rakka.setAuthorization(req);
+            },
+            success    : function () {
+                window.location.replace(url);
+            },
+            error      : function (req) {
+                Rakka.hideWaitingMessage();
+                
+                var $area = Rakka.switchScreen();
+                $area.text("Error: " + req.status + " " + req.statusText);
+            }
+        });
+    };
+
+})();
\ No newline at end of file