function handleerror(xmldata) {
    if ($('error', xmldata).size()) {
        var msg = 'Es ist ein Fehler aufgetreten:\n';
        $('error', xmldata).find('errormsg').each(function(i) {
            msg += $(this).text();
        });
        alert(msg);
        $('#content').show();
        return true;
    }
    return false;
}

function updateusers(xmldata) {
    var uid = $(xmldata).find('uid').text();
    var username = $(xmldata).find('username').text();
    var firstname = $(xmldata).find('firstname').text();
    var lastname = $(xmldata).find('lastname').text();
    var loggedin = $(xmldata).find('loggedin').text();
    var htmltext = '<td>' + username + '</td><td>' + lastname + ', ' + firstname + '</td><td><a id="edit' + uid + '" class="editlink" href="#" title="Die Daten dieses Nutzers bearbeiten"><img class="actionicon" src="images/edit.png" width="16" height="16" alt="bearbeiten"/></a>';
    if (loggedin == '0') {
        htmltext = htmltext + '<a id="delete' + uid + '" class="deletelink" href="#" title="Die Daten dieses Nutzers löschen"><img class="actionicon" src="images/delete.png" width="16" height="16" alt="löschen" /></a>';
    }
    htmltext = htmltext + '</td>';
    $('#usertable').find('tr#uid' + uid).empty().append(htmltext);
    if (!($('#usertable').find('tr#uid' + uid).size())) {
        var rows = $('#usertable').find('tr');
        var inserted = false;
        for (var i = 0; !inserted && i < rows.length; i++) {
            if ($(rows[i]).find('td:first').text() > username) {
                $(rows[i]).before(
                    '<tr id="uid' + uid + '">' + htmltext + '</tr>');
                inserted = true;
            }
        }
        if (!inserted) {
            $(rows[rows.length-1]).before(
                '<tr id="uid' + uid + '">' + htmltext + '</tr>');
        }
    }
    $('#usertable').find('tr#uid' + uid).find('a.editlink').click(function() {
        edituser(this.id.substr(4));
    });
    $('#usertable').find('tr#uid' + uid).find('a.deletelink').click(function() {
        deleteuser(this.id.substr(6));
    });
    $('#content').show();
}

function getEditUserForm(title, username, firstname, lastname, groups, userid) {
    var retval;
    retval = '<form action="#" id="userform"><fieldset class="dynaform"><legend><img id="closer" src="images/x.png" width="16" height="16" alt="Schließen" /> ' + title + '</legend><div class="formelement"><label for="input-username">Nutzername:</label><input id="input-username" type="text" name="username" value="' + username + '" ';
    if (userid != null) {
        retval = retval + ' readonly="readonly"';
    }
    retval = retval + '/></div><div class="formelement"><label for="input-firstname">Vorname:</label><input id="input-firstname" type="text" name="firstname" value="' + firstname + '" /></div><div class="formelement"><label for="input-lastname">Nachname:</label><input id="input-lastname" type="text" name="lastname" value="' + lastname + '" /></div><div class="formelement"><label for="pwd1">Passwort:</label><input type="password" name="pwd1" /></div><div class="formelement"><label for="pwd2">Wiederholung:</label><input type="password" name="pwd2" /></div><div class="formelement"><label for="groups">Gruppen:</label><input type="text" name="groups" class="form-autocomplete" id="input-groups" value="' + groups + '" /><input type="hidden" class="autocomplete" id="input-groups-autocomplete" value="getgroups.php" /></div><div class="formactions"><input type="submit" name="submit" value="Absenden" /></div></fieldset></form>';
    return retval;
}

function displayusereditor(title, userid, username, firstname, lastname, groups) {
    $('#content').hide();
    $('#usereditor').hide().empty().append(getEditUserForm(title, username, firstname, lastname, groups, userid)).show();
    DAV.autocompleteAutoAttach();
    $('#closer').click(function() {
        $('#usereditor').hide().empty();
        $('#content').show();
    });
    $('#userform').find('#input-username').focus();
    $('#userform').submit(function() {
        var params;
        if (userid == null) {
            if (!this.username.value.match(/^[a-zA-Z0-9]{2,}$/)) {
                alert('Der Nutzername muss aus mindestens 2 Buchstaben oder Ziffern bestehen und darf keine sonstigen Zeichen enthalten.');
                this.username.focus();
                return false;
            }
        }
        if (userid == null || this.pwd1.value.length > 0) {
            if (this.pwd1.value.length < 8) {
                alert('Das Passwort muss mindestens 8 Zeichen lang sein!');
                this.pwd1.focus();
                return false;
            }
            if (this.pwd1.value != this.pwd2.value) {
                alert('Passwort und Wiederholung müssen übereinstimmen!');
                this.pwd2.focus();
                return false;
            }
        }
        if (!this.groups.value.match(/^([0-9a-zA-z]+[,\s]*)+$/)) {
            alert('Die Gruppenangabe muss eine durch Kommata getrennte Liste von Gruppennamen, die aus Buchstaben und Ziffern zusammengesetzt sein können, sein.');
            this.groups.focus();
            return false;
        }
        if (userid == null) {
            params = {method    : 'submituser',
                      username  : this.username.value,
                      firstname : this.firstname.value,
                      lastname  : this.lastname.value,
                      password  : this.pwd1.value,
                      groups    : this.groups.value};
        } else {
            params = {method    : 'submituser',
                      uid       : userid,
                      username  : this.username.value,
                      firstname : this.firstname.value,
                      lastname  : this.lastname.value,
                      password  : this.pwd1.value,
                      groups    : this.groups.value};
        }
        $.post(
            "users.php", params,
            function(retval) {
                $('div#usereditor').hide().empty();
                if (!handleerror(retval)) {
                    updateusers(retval);
                }
            });
        return false;
    });
}

function deleteuserdialog(userid, username, firstname, lastname) {
    $("#usereditor").hide().empty();
    var msg = 'Soll der Nutzer ' + firstname + ' ' + lastname +
        ' mit dem Login ' + username + ' wirklich gelöscht werden?';
    if (confirm(msg) == true) {
        $.post(
            "users.php",
            {method : 'deleteuser',
             uid : userid},
            function(retval) {
                if (!handleerror(retval)) {
                    var deluid = $('uid:first', retval).text();
                    $('#usertable').find('tr#uid' + deluid).remove();
                }
            });
    }
}

function deleteuser(userid) {
    $.get(
        "users.php",
        {uid    : userid,
         method : 'getuserdata'},
        function(retval) {
            if (!handleerror(retval)) {
                var username, lastname, firstname;
                username = $("username:first", retval).text();
                lastname = $("lastname:first", retval).text();
                firstname = $("firstname:first", retval).text();
                deleteuserdialog(userid, username, firstname, lastname);
            }
        });
}

function edituser(userid) {
    $.get(
        "users.php",
        {uid    : userid,
         method : 'getuserdata'},
        function(retval) {
            if (!handleerror(retval)) {
                var username, lastname, firstname, groups;
                username = $("username:first", retval).text();
                lastname = $("lastname:first", retval).text();
                firstname = $("firstname:first", retval).text();
                groups = $("groups:first", retval).text();
                displayusereditor('Nutzerdaten bearbeiten', userid, username,
                                  firstname, lastname, groups);
            }
        });
}

function newuser() {
    displayusereditor('Neuen Nutzer anlegen', null, '', '', '', '');
}

$(function() {
    $("a.editlink").each(function(i) {
        $(this).click(function() { edituser(this.id.substr(4)); });
    });
    $("a.newlink").each(function(i) {
        $(this).click(function() { newuser(); });
    });
    $("a.deletelink").each(function(i) {
        $(this).click(function() { deleteuser(this.id.substr(6)); });
    });
});