var publicLoginHelper = {
    xmlHttp: undefined,

    prepareRequest: function() {
        if (this.xmlHttp) {
//            if (this.xmlHttp.readyState < 4) {
                this.xmlHttp.abort(); // Safari and IE needs this
//            }
//            return this.xmlHttp;
        }
        var xmlhttp;
        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            try {
                xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
            } catch (ex) {
                try {
                    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
                } catch (ex) {
                }
            }
        }
        this.xmlHttp = xmlhttp;
        return xmlhttp;
    },
    triggerHttpAuth: function(/* String */ user, /* String */ pass, /* String */ siteRoot) {
        var xmlhttp = this.prepareRequest();
        // Post to root, to let the auth be sent with every request to this server
        // Safari doesn't tolerate '@' in usernames. See KolibriAuthenticationHandler#COMMERCIAL_AT_REPLACEMENT
        //var encodedUser = user.replace("@", "&");
//        xmlhttp.open('POST', '/dologin?sling:authRequestLogin=1&site=' + siteRoot, false, encodedUser, pass);
        xmlhttp.open('POST', '/dologin?site=' + siteRoot + "&:kolibri:username=" + user + "&:kolibri:password="+pass, false);
//        xmlhttp.withCredentials = true; // Safari needs this
        //        xmlhttp.open('POST', 'http://' + user + ':' + pass + '@' + 'localhost:8080/dologin?sling:authRequestLogin=1&site=' + siteRoot, false, user, pass);
        xmlhttp.send('');
    },
    prevalidateResult: undefined,
    prevalidate: function(/* String */ user, /* String */ pass, /* String */ siteRoot) {
        var xmlhttp = this.prepareRequest();

        xmlhttp.open("GET", "./.validatelogin.json?site=" + siteRoot + "&username=" + user + "&password=" + pass + "&now=" + new Date().toString(), false);
        xmlhttp.send();
        // This will work because we send a synchrounos request.
        // Before you change this, see http://lukav.com/wordpress/2007/04/12/firefox-firebug-and-synchronos-calls-problem/
        this.prevalidateResult = xmlhttp.status == 200;
        return this.prevalidateResult;
    },

    toggleChangePasswordForm: function() {
       var changePasswordForm = document.getElementById("changePasswordForm");
       var loginForm = document.getElementById("publicLoginForm");
       var loginButton = document.getElementById("publicLoginButton");
       var currentPasswordLabel = document.getElementById("currentPasswordLabel");
       if (changePasswordForm.style.display == "none") {
          changePasswordForm.style.display = "block";
          loginButton.innerHTML = "Bytt passord";
          currentPasswordLabel.style.display = "none";
//          loginForm.style.display = "none";
       } else {
          changePasswordForm.style.display = "none";
          loginButton.innerHTML = "Logg inn";
          currentPasswordLabel.style.display = "inline";
//          loginForm.style.display = "block";
       }
    },

    setMessage: function(form, message, clazz) {
        if (!clazz) {
            clazz = "";
        }
        var heading = document.getElementById("loginmessage");
        var submitButton = document.getElementById("publicLoginButton");
        // Remove text
        while (heading.childNodes.length > 0) {
            heading.removeChild(heading.childNodes[0]);
        }
        heading.appendChild(document.createTextNode(message));
        heading.setAttribute("class", clazz);
        if (submitButton) {
            if (clazz == "working") {
                submitButton.setAttribute("disabled", "disabled");
            } else {
                submitButton.removeAttribute("disabled");
            }
        }
    },

    changePassword: function(form, siteRoot) {
       try {
         var username = form.elements[":kolibri:username"].value;
         var password = form.elements[":kolibri:password"].value;
         var newPassword1 = form.elements["newPassword1"].value;
         var newPassword2 = form.elements["newPassword2"].value;
         this.setMessage(form, "Sjekker brukernavn og passord ...", "working");
         valid = this.prevalidate(username, password, siteRoot);
         if (!valid) {
           this.setMessage(form, "Ugyldig brukernavn/nåværende passord. Prøv igjen.");
         }
         this.setMessage(form, "Endrer passord ...");
         var xhr = this.prepareRequest();
         xhr.open("POST", siteRoot + "/kolibri:users/" + form.elements[":kolibri:username"].value + ".changePassword.json", false); // Invoke ChangePasswordServlet
         xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
         xhr.send(":kolibri:username=" + username + "&:kolibri:password=" + password +"&site=" + siteRoot + "&newPassword1=" + newPassword1 + "&newPassword2=" + newPassword2+"&:kolibri:skipAuthCookie=true");
         var status = xhr.status;
         if (status >= 200 && status < 400) {
            alert("Passordet ditt er endret. Du kan nå logge inn med det nye passordet");
            window.history.go(-1);
            return false;
         } else if (status == 401) {
            this.setMessage(form, "Feil brukernavn/passord");
         } else {
            eval("var res= " + xhr.responseText);
            if (res.error.newPassword1 && res.error.newPassword1.missing || res.error.newPassword2 && res.error.newPassword2.missing) {
               this.setMessage(form, "Alle felter må fylles ut");
            } else if (res.error.newPassword2) {
               this.setMessage(form, res.error.newPassword2.message);
            } else if (res.error.newPassword1) {
               this.setMessage(form, res.error.newPassword1.message);
            } else {
               this.setMessage(form, xhr.responseText);            
            }
         }
       } catch(err) {
         console.error(err);
         this.setMessage(form, err);
       }
       return false;
    },

    passwordReminder: function(form, siteRoot) {
        //form.elements["forgot"].disabled = "true";
        var username = form.elements[":kolibri:username"].value;
        if (username == "") {
            this.setMessage(form, "Skriv inn epost-adressen din før du ber om passord");
            return;
        }
        var xmlhttp = this.prepareRequest();
        xmlhttp.open("GET", "/resetpassword.json?:kolibri:username=" + username + "&site=" + siteRoot, false);
        xmlhttp.send();
        this.setMessage(form, "Nytt passord har blitt sendt til " + username, "info");
    },
    postForm: function(/* HTMLForm */ form, /* String */ siteRoot) {
        try {
            var username = form.elements[":kolibri:username"].value;
            var password = form.elements[":kolibri:password"].value;
            this.setMessage(form, "Logger inn ...", "working");
            var valid;
            try {
                valid = this.prevalidate(username, password, siteRoot);
            } catch (err) {
                console.log("Error prevalidating password", err);
                this.setMessage(form, "Systemfeil ved validering av brukernavn/passord. Vennligst prøv igjen senere", "error");
                return false;
            }
            if (!valid) {
                this.setMessage(form, "Ugyldig brukernavn/passord. Prøv igjen.");
            } else {
                try {
                    this.triggerHttpAuth(username, password, siteRoot);
                } catch(err) {
                    this.setMessage(form, "Systemfeil ved pålogging. Vennligst prøv igjen senere", "error");
                    console.log("Error triggering HTTP auth", err);
                    return false;
                }
                document.location = document.location;
            }
        } catch(err) {
            if (console) {
                console.log(err);
            } else {
                alert(err);
            }
        }
        return false;
    }
};

