+CtxType CTX_USERLIST = CTX_NONE;
+/*
+ * show a list of available users to edit them
+ * message the header message???
+ * preselect = which user should be selected in the browser
+ */
+void select_user_to_edit(const char *preselect)
+{
+ output_headers(1, 0, 0, 0, 1, 0);
+ do_template("aide_edituser_select");
+ end_burst();
+}
+
+
+typedef struct _UserListEntry {
+ int UID;
+ int AccessLevel;
+ int nLogons;
+ int nPosts;
+
+ StrBuf *UserName;
+ StrBuf *Passvoid;
+ time_t LastLogonT;
+ /* Just available for Single users to view: */
+ unsigned int Flags;
+ int DaysTillPurge;
+ int HasBio;
+
+ StrBuf *PrimaryEmail;
+ StrBuf *OtherEmails;
+
+} UserListEntry;
+
+
+UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser, const char *Pos)
+{
+ UserListEntry *ul;
+
+ if (StrLength(SerializedUser) < 8)
+ return NULL;
+
+ ul = (UserListEntry*) malloc(sizeof(UserListEntry));
+ ul->UserName = NewStrBuf();
+ ul->Passvoid = NewStrBuf();
+ ul->PrimaryEmail = NewStrBuf();
+ ul->OtherEmails = NewStrBuf();
+
+ StrBufExtract_NextToken(ul->UserName, SerializedUser, &Pos, '|');
+ StrBufExtract_NextToken(ul->Passvoid, SerializedUser, &Pos, '|');
+ ul->Flags = StrBufExtractNext_unsigned_long(SerializedUser, &Pos, '|');
+ ul->nLogons = StrBufExtractNext_int( SerializedUser, &Pos, '|');
+ ul->nPosts = StrBufExtractNext_int( SerializedUser, &Pos, '|');
+ ul->AccessLevel = StrBufExtractNext_int( SerializedUser, &Pos, '|');
+ ul->UID = StrBufExtractNext_int( SerializedUser, &Pos, '|');
+ ul->LastLogonT = StrBufExtractNext_long( SerializedUser, &Pos, '|');
+ ul->DaysTillPurge = StrBufExtractNext_int( SerializedUser, &Pos, '|');
+ return ul;
+}
+
+void DeleteUserListEntry(void *vUserList)
+{
+ UserListEntry *ul = (UserListEntry*) vUserList;
+ if (!ul) return;
+ FreeStrBuf(&ul->UserName);
+ FreeStrBuf(&ul->Passvoid);
+ FreeStrBuf(&ul->PrimaryEmail);
+ FreeStrBuf(&ul->OtherEmails);
+ free(ul);
+}
+
+UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
+{
+ const char *Pos = NULL;
+ UserListEntry *ul;
+
+ if (StrLength(SerializedUserList) < 8)
+ return NULL;
+
+ ul = (UserListEntry*) malloc(sizeof(UserListEntry));
+ ul->UserName = NewStrBuf();
+ ul->Passvoid = NewStrBuf();
+ ul->PrimaryEmail = NewStrBuf();
+ ul->OtherEmails = NewStrBuf();
+
+ StrBufExtract_NextToken(ul->UserName, SerializedUserList, &Pos, '|');
+ ul->AccessLevel = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+ ul->UID = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+ ul->LastLogonT = StrBufExtractNext_long(SerializedUserList, &Pos, '|');
+ ul->nLogons = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+ ul->nPosts = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+ StrBufExtract_NextToken(ul->Passvoid, SerializedUserList, &Pos, '|');
+ ul->Flags = 0;
+ ul->HasBio = 0;
+ ul->DaysTillPurge = -1;
+ return ul;
+}
+
+/*
+ * Sort by Username
+ */
+int CompareUserListName(const void *vUser1, const void *vUser2)
+{
+ UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+ UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+ return strcmp(ChrPtr(u1->UserName), ChrPtr(u2->UserName));
+}
+
+int CompareUserListNameRev(const void *vUser1, const void *vUser2)
+{
+ UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+ UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+ return strcmp(ChrPtr(u2->UserName), ChrPtr(u1->UserName));
+}
+
+int GroupchangeUserListName(const void *vUser1, const void *vUser2)
+{
+ UserListEntry *u1 = (UserListEntry*) vUser1;
+ UserListEntry *u2 = (UserListEntry*) vUser2;
+ return ChrPtr(u2->UserName)[0] != ChrPtr(u1->UserName)[0];
+}
+
+/*
+ * Sort by access level
+ */
+int CompareAccessLevel(const void *vUser1, const void *vUser2)
+{
+ UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+ UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);