]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - js/login.js
implemented login/out interface
[Rakka.git] / js / login.js
diff --git a/js/login.js b/js/login.js
new file mode 100644 (file)
index 0000000..95b1f00
--- /dev/null
@@ -0,0 +1,128 @@
+(function () {
+    
+    Rakka.showLoginPanel = function () {
+        var $area = Rakka.switchScreen();
+
+        $area.append($.H1({}, "Login"));
+
+        var fldUserID
+            = $.INPUT({type: "text"});
+
+        var fldPassword
+            = $.INPUT({type: "password"});
+
+        var btnLogin
+            = $.INPUT({type: "button", value: "Login"});
+
+        $(btnLogin).click(function () {
+            login(fldUserID.value, fldPassword.value);
+        });
+
+        var btnCancel
+            = $.INPUT({type: "button", value: "Cancel"});
+
+        $(btnCancel).click(function () {
+            Rakka.restoreScreen();
+        });
+
+        var loginPanel
+            = $.TABLE({className: "loginPanel"},
+                      $.TBODY({},
+                              $.TR({},
+                                   $.TH({}, "User ID"),
+                                   $.TD({}, fldUserID)
+                                  ),
+                              $.TR({},
+                                   $.TH({}, "Password"),
+                                   $.TD({}, fldPassword)
+                                  ),
+                              $.TR({},
+                                   $.TH({}),
+                                   $.TD({}, btnLogin, btnCancel)
+                                  )
+                             )
+                     );
+
+        $area.append(loginPanel);
+    };
+
+    var login = function (userID, password) {
+        $.ajax({
+            type      : "GET",
+            url       : Rakka.baseURI + "checkAuth",
+            beforeSend: function (req) {
+                req.setRequestHeader(
+                    "Authorization",
+                    "Basic " + Rakka.encodeBase64(userID + ":" + password));
+            },
+            success   : function () {
+                document.cookie
+                    = "rakkaLoginInfo="
+                    + Rakka.encodeBase64(userID + ":" + password)
+                    + ";max-age=31536000";
+                updateLoginState();
+                Rakka.restoreScreen();
+            },
+            error     : function (req) {
+                if (req.status == 403) {
+                    alert("Login failed: wrong ID or password");
+                }
+                else {
+                    alert("Error: " + req.status + " " + req.statusText);
+                }
+            }
+        });
+    };
+
+    var logout = function () {
+        document.cookie = "rakkaLoginInfo=;max-age=0";
+        updateLoginState();
+    };
+
+    var currentUserID;
+    var currentPassword;
+
+    var updateLoginState = function () {
+        currentUserID   = null;
+        currentPassword = null;
+        
+        var cookies = document.cookie.split(/;\s*/);
+        $.each(cookies, function () {
+            var m = this.match(/^([^=]*)=(.*)$/);
+            if (m) {
+                var key   = m[1];
+                var value = m[2];
+
+                if (key == "rakkaLoginInfo") {
+                    m = Rakka.decodeBase64(value).match(/^([^:]*):(.*)$/);
+                    if (m) {
+                        currentUserID   = m[1];
+                        currentPassword = m[2];
+                    }
+                }
+            }
+        });
+
+        if (currentUserID != null) {
+            /* ログイン中 */
+            $("input.loginButton")
+                .val("Logout [" + currentUserID + "]")
+                .unbind("click")
+                .click(function () {
+                    logout();
+                });
+        }
+        else {
+            /* ログインしてゐない */
+            $("input.loginButton")
+                .val("Login")
+                .unbind("click")
+                .click(Rakka.showLoginPanel);
+        }
+    };
+
+    $(document).ready(function () {
+        updateLoginState();
+    });
+
+})();