/* mailboxes.c */

#include "ml.h"

Menu mailopen_file_menu[] = {
  { NULL, "create", NUL_TERM, 
      mailboxes_create, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "delete", NUL_TERM, 
      mailboxes_delete, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "rename", NUL_TERM, 
      mailboxes_rename, NULL, 0, NULL, NULL, BTN_MAILBOX_DONEWS },
  { NULL, "subscribe_only", NUL_TERM, 
      mailboxes_subscribe_only, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "unsubscribe_only", NUL_TERM, 
      mailboxes_unsubscribe_only, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "create_only", NUL_TERM, 
      mailboxes_create_only, NULL, 0, NULL, NULL, BTN_MAILBOX_DONEWS },

};


Menu mailopen_option_menu[] = {
  { NULL, "everything", NUL_TERM, 
      mailboxes_everything, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "subscribed", NUL_TERM, 
      mailboxes_subscribed, NULL, 0, NULL, NULL, BTN_ON },
};


Menu mailboxopen_menu[] = {
  { NULL, "subscribe_menu", NUL_TERM, 
      NULL, mailopen_file_menu, XtNumber(mailopen_file_menu), 
      NULL, NULL, BTN_ON },
  { NULL, "option_menu", NUL_TERM,
      NULL, mailopen_option_menu, XtNumber(mailopen_option_menu), 
      NULL, NULL, BTN_ON },
  { NULL, "HELP", NUL_TERM, 
      mailboxes_help, NULL, 0, NULL, NULL, BTN_ON },
};


Button_Menu mailopen_buttons[] = {
  { "mbox_open_btn",    mailboxes_open,    NULL, BTN_ON,             NULL },
  { "mbox_scan_btn",    mailboxes_scan,    NULL, BTN_NOSELECTION,    NULL },
  { "mbox_fetch_btn",   mailboxes_fetch,   NULL, BTN_ON,             NULL },
  { "mbox_dismiss_btn", mailboxes_dismiss, NULL, BTN_ON,             NULL },
};


Button_Menu mailcopy_buttons[] = {
  { "mbox_copy_btn",    mailboxes_copy,    NULL, BTN_MAILBOX_DONEWS, NULL },
  { "mbox_move_btn",    mailboxes_move,    NULL, BTN_MAILBOX_DONEWS, NULL },
  { "mbox_fetch_btn",   mailboxes_fetch,   NULL, BTN_ON,             NULL },
  { "mbox_cancel_btn",  mailboxes_cancel,  NULL, BTN_ON,             NULL },
};




#ifdef __STDC__
Mailbox_List *new_mailbox_list(void)
#else
Mailbox_List *new_mailbox_list()
#endif
{
  Mailbox_List *mailbox_list = (Mailbox_List *) fs_get(sizeof(Mailbox_List));
  
  mailbox_list->name       = NULL;
  mailbox_list->delimiter  = NUL_TERM;
  mailbox_list->attribute  = 0L;
  mailbox_list->nmsgs      = 0L;
  mailbox_list->recent     = 0L;
  mailbox_list->unseen     = 0L;
  mailbox_list->validity   = 0L;
  mailbox_list->uidnext    = 0L;
  
  mailbox_list->next       = NULL;
  mailbox_list->prev       = NULL;
  return(mailbox_list);
}

#ifdef __STDC__
void free_mailbox_list(Mailbox_List *mailbox_list)
#else
void free_mailbox_list(mailbox_list)
     Mailbox_List *mailbox_list;
#endif
{
  if(mailbox_list == NULL)
    return;

  free_mailbox_list(mailbox_list->prev);
  if(mailbox_list->name != NULL)
    fs_give((void **) &mailbox_list->name);
  fs_give((void **) &mailbox_list);

  mailbox_list = NULL;
  return;
}


#ifdef __STDC__
void mailboxes_check_buttons(Mailbox_Win *mailbox_win)
#else
void mailboxes_check_buttons(mailbox_win)
     Mailbox_Win *mailbox_win;
#endif
{
  if(mailbox_win && mailbox_win->is_realized)
    update_buttons(mailbox_win->buttonlist,
		   mailbox_win->button_state);
  return;
}





#ifdef __STDC__
char *get_mailbox_name(Widget w, char *current_server,
		       Boolean *changed, Boolean *move)
#else
char *get_mailbox_name(w, current_server, changed, move)
     Widget w;
     char *current_server;
     Boolean *changed;
     Boolean *move;
#endif
{
  Server_Config *server;
  Mailbox_Win *mailbox_win;
  Boolean errors = FALSE;
  char *ret = NULL;
  char *patt;

  mailbox_win = mailboxes(NULL, TRUE);

  server = find_configuration(preferences.defaultConfig);
  if(server) {
    XmTextSetString(mailbox_win->server,server->name);
    XmTextSetString(mailbox_win->mailbox, preferences.default_savebox);
    if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
      errors = TRUE;
  }
  else
    errors = TRUE;

  if(errors == FALSE) {

    patt = XmTextGetString(mailbox_win->pattern);

    load_mailbox_list(mailbox_win, mailbox_win->current, patt,
		      (mailbox_win->everything == TRUE)
		      ? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
    fs_give((void **) &patt);
    stuff_mailbox_list(mailbox_win,FALSE);
    modal_main_loop(&mailbox_win->done);
  }

  XtPopdown(mailbox_win->shell);

  if(mailbox_win->move == TRUE)
    *move = TRUE;
  else
    *move = FALSE;
      
  if(errors == FALSE) {
    if(mailbox_win->current != NULL) {
      session->active = mailbox_win->current;
      if((strcasecmp(current_server,
		     (mailbox_win->current->hostname != NULL)
		     ? mailbox_win->current->hostname 
		     : EMPTYSTR)) != STRMATCH) {
	ret = get_mailbox_string_from_window(mailbox_win);
	*changed = TRUE;
      }
      else {
	ret = get_mailbox_simple_from_window(mailbox_win);
	*changed = FALSE;
      }
    }
  }
  else
    session->active = NULL;

  XtDestroyWidget(mailbox_win->shell);

  pop_cursor();
  return(ret);

}




#ifdef __STDC__
Mailbox_Win *mailboxes(MainWindow *mwin, Boolean subwin)
#else
Mailbox_Win *mailboxes(mwin, subwin)
     MainWindow *mwin;
     Boolean subwin;
#endif
{
  Arg args[ARGLISTSIZE];
  int n = 0;
  int i = 0;
  Mailbox_Win *mailbox_win;
  XtTranslations translations;
  char *ret = NULL;

  if(subwin == FALSE) {
    if(session->mailboxwin != NULL) {
      if(session->mailboxwin->is_realized == TRUE) {
	de_iconify(session->mailboxwin->shell);
	stuff_mailbox_list(session->mailboxwin, TRUE);
      }
      else {
	XtPopup(session->mailboxwin->shell, XtGrabNone);
	session->mailboxwin->is_realized = TRUE;
	stuff_mailbox_list(session->mailboxwin, TRUE);
      }
      session->mailboxwin->mwin = mwin;
      return(session->mailboxwin);
    }
  }
  else
    push_cursor(PIRATE_CURSOR);


  mailbox_win = (Mailbox_Win *) fs_get(sizeof(Mailbox_Win));
  mailbox_win->is_realized = FALSE;
  if(subwin == TRUE)
    session->mailcopywin = mailbox_win;
  else
    session->mailboxwin = mailbox_win;

  mailbox_win->mwin = mwin;
  mailbox_win->buttonlist = NULL;
  mailbox_win->button_state = BTN_NOSELECTION;
  mailbox_win->done = 0;
  mailbox_win->everything = FALSE;
  mailbox_win->is_realized = FALSE;
  mailbox_win->item_no = 0;
  mailbox_win->move = FALSE;
  mailbox_win->top_level = (subwin == TRUE) ? FALSE : TRUE;
  mailbox_win->current = find_configuration(preferences.defaultConfig);

  if(mailbox_win->current) {
    mailbox_win->type = ((mailbox_win->current->type == SERVICE_NEWS) 
			 || (mailbox_win->current->type == SERVICE_NNTP))
      ? MAILBOX_TYPE_NEWS : MAILBOX_TYPE_MAIL;
  }
  else
    mailbox_win->type = MAILBOX_TYPE_MAIL;


  /*
   *  POP servers are defined as "news" here for the purpose of setting
   *  buttons. One cannot copy to the POP3 service.
   */

  if((mailbox_win->type == MAILBOX_TYPE_NEWS) || 
     (mailbox_win->current->type == SERVICE_POP))
    mailbox_win->button_state |= BTN_MAILBOX_DONEWS;
  else
    mailbox_win->button_state |= BTN_MAILBOX_DOMAIL;


  push_cursor(WATCH_CURSOR);

  if(preferences.autoPlace == TRUE) {
    XtSetArg(args[n], XtNx, -1000); n ++;
    XtSetArg(args[n], XtNy, -1000); n ++;
  }

  XtSetArg (args[n], XmNdeleteResponse, XmDO_NOTHING); n++;       
  mailbox_win->shell = XtCreatePopupShell("mailopen",
					  topLevelShellWidgetClass, 
					  session->shell,
					  args, n); 
  n = 0;
  AddDestroyCallback (mailbox_win->shell);
  setup_editres(mailbox_win->shell);

  if(mbox_icon != (Pixmap) None)
    XtVaSetValues(mailbox_win->shell,
		  XmNiconPixmap,mbox_icon,
		  NULL);

  mailbox_win->form = XmCreateForm(mailbox_win->shell, 
				   "form", args, n ); 
  n = 0;

  XtSetArg(args[n], XmNtopAttachment,   XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNleftAttachment,  XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
  mailbox_win->menubar = XmCreateMenuBar(mailbox_win->form, 
					 "menubar", args, n); 
  n = 0;
  XtManageChild(mailbox_win->menubar);

  make_buttons(&mailbox_win->buttonlist, NULL, 
	       mailbox_win->menubar, 
	       mailboxopen_menu, 
	       XtNumber(mailboxopen_menu),
	       mailbox_win->button_state, 
	       (XtPointer) mailbox_win, ROOTMENULEVEL);


  XtSetArg(args[n], XmNadjustMargin, FALSE);      n ++;
  XtSetArg(args[n], XmNmarginWidth, 0);           n ++;
  XtSetArg(args[n], XmNborderWidth, 0);           n ++;

  XtSetArg(args[n], XmNtopAttachment,   XmATTACH_WIDGET); n ++;
  XtSetArg(args[n], XmNtopWidget, mailbox_win->menubar);  n ++;
  XtSetArg(args[n], XmNleftAttachment,  XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n ++;
  XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n ++;

  mailbox_win->rowcol = XmCreateRowColumn(mailbox_win->form, 
					  "rowcol", args, n); 
  n = 0;

  if(mailbox_win->top_level) {
    make_secondbuttons(mailbox_win->buttonlist,
		       mailbox_win->rowcol, 
		       mailopen_buttons, XtNumber(mailopen_buttons),
		       mailbox_win->button_state, (XtPointer) mailbox_win);
  }
  else {
    make_secondbuttons(mailbox_win->buttonlist,
		       mailbox_win->rowcol, 
		       mailcopy_buttons, XtNumber(mailcopy_buttons),
		       mailbox_win->button_state, (XtPointer) mailbox_win);
  }

  XtManageChild(mailbox_win->rowcol);
  
  XtSetArg(args[n], XmNtraversalOn, FALSE); n ++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
  XtSetArg(args[n], XmNtopWidget, mailbox_win->rowcol); n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNborderWidth, 0); n ++;
  mailbox_win->conf_button = XmCreatePushButton(mailbox_win->form,
						"conf_button", 
						args, n);
  n = 0;
  XtManageChild(mailbox_win->conf_button);

  XtAddCallback(mailbox_win->conf_button, XmNactivateCallback,
		(XtCallbackProc) mailboxes_configure, mailbox_win );

  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
  XtSetArg(args[n], XmNtopWidget, mailbox_win->rowcol); n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n ++;
  XtSetArg(args[n], XmNleftWidget,mailbox_win->conf_button); n ++;
  mailbox_win->server = XmCreateTextField(mailbox_win->form,
					  "server_textfld",
					   args, n); 
  n = 0;
  XtManageChild(mailbox_win->server);

 translations = XtParseTranslationTable(GLOBAL_text_field_translations);
  XtOverrideTranslations(mailbox_win->server,translations);
  translations = 
    XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
  XtOverrideTranslations(mailbox_win->server,translations);

  XtAddCallback(mailbox_win->server, XmNmodifyVerifyCallback, 
		(XtCallbackProc) text_field_edit, NULL);

  XtAddCallback(mailbox_win->server, XmNactivateCallback,
		(XtCallbackProc) mailboxes_set_configure,
		(XtPointer) mailbox_win);


  XmTextSetString(mailbox_win->server, 
		  ((mailbox_win->current != NULL) &&
		   (mailbox_win->current->name != NULL))
		  ? mailbox_win->current->name
		  : EMPTYSTR);

  
  XtSetArg(args[n], XmNtraversalOn, FALSE);               n ++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);   n ++;
  XtSetArg(args[n], XmNtopWidget, mailbox_win->server);   n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);    n ++;
  XtSetArg(args[n], XmNborderWidth, 0);                   n ++;
  mailbox_win->patt_button = XmCreatePushButton(mailbox_win->form,
						"patt_button", 
						args, n);
  n = 0;
  XtManageChild(mailbox_win->patt_button);

  XtAddCallback(mailbox_win->patt_button, XmNactivateCallback,
		(XtCallbackProc) mailboxes_toggle_pattern, mailbox_win );
  
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);      n ++;
  XtSetArg(args[n], XmNtopWidget, mailbox_win->server);      n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);      n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET);     n ++;
  XtSetArg(args[n], XmNleftWidget,mailbox_win->patt_button); n ++;
  mailbox_win->pattern = XmCreateTextField(mailbox_win->form,
					  "pattern_textfld",
					   args, n); 
  n = 0;
  XtManageChild(mailbox_win->pattern);

 translations = XtParseTranslationTable(GLOBAL_text_field_translations);
  XtOverrideTranslations(mailbox_win->pattern,translations);
  translations = 
    XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
  XtOverrideTranslations(mailbox_win->pattern,translations);

  XtAddCallback(mailbox_win->pattern, XmNmodifyVerifyCallback, 
		(XtCallbackProc) text_field_edit, NULL);

  XtAddCallback(mailbox_win->pattern, XmNactivateCallback,
		(XtCallbackProc) mailboxes_pattern,
		(XtPointer) mailbox_win);

  XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);

  
  XtSetArg(args[n], XmNtraversalOn,    FALSE);                n ++;
  XtSetArg(args[n], XmNtopAttachment,  XmATTACH_WIDGET);      n ++;
  XtSetArg(args[n], XmNtopWidget,      mailbox_win->pattern); n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);        n ++;
  XtSetArg(args[n], XmNborderWidth,    0);                    n ++;
  mailbox_win->name_button = XmCreatePushButton(mailbox_win->form,
						"name_button", 
						args, n);
  n = 0;
  XtManageChild(mailbox_win->name_button);

  XtAddCallback(mailbox_win->name_button, XmNactivateCallback,
		(XtCallbackProc) mailboxes_toggle_mailbox, mailbox_win );
  
  XtSetArg(args[n], XmNtopAttachment,   XmATTACH_WIDGET);          n ++;
  XtSetArg(args[n], XmNtopWidget,       mailbox_win->pattern);     n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);            n ++;
  XtSetArg(args[n], XmNleftAttachment,  XmATTACH_WIDGET);          n ++;
  XtSetArg(args[n], XmNleftWidget,      mailbox_win->name_button); n ++;
  mailbox_win->mailbox = XmCreateTextField(mailbox_win->form,
					  "mailbox_textfld",
					   args, n); 
  n = 0;
  XtManageChild(mailbox_win->mailbox);

 translations = XtParseTranslationTable(GLOBAL_text_field_translations);
  XtOverrideTranslations(mailbox_win->mailbox,translations);
  translations = 
    XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
  XtOverrideTranslations(mailbox_win->mailbox,translations);

  XtAddCallback(mailbox_win->mailbox, XmNmodifyVerifyCallback, 
		(XtCallbackProc) text_field_edit, NULL);

  if(mailbox_win->top_level) 
    XtAddCallback(mailbox_win->mailbox, XmNactivateCallback,
		  (XtCallbackProc) mailboxes_open,
		  (XtPointer) mailbox_win);
  else
    XtAddCallback(mailbox_win->mailbox, XmNactivateCallback,
		  (XtCallbackProc) mailboxes_copy,
		  (XtPointer) mailbox_win);

  XmTextSetString(mailbox_win->mailbox, 
		  ((mailbox_win->current != NULL) 
		   && (mailbox_win->current->mailbox != NULL))
		  ? mailbox_win->current->mailbox
		  : EMPTYSTR);

  XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmSTATIC);         n ++;
  XtSetArg(args[n], XmNlistSizePolicy,         XmCONSTANT);       n ++;
  XtSetArg(args[n], XmNselectionPolicy,        XmSINGLE_SELECT);  n ++;
  mailbox_win->list = XmCreateScrolledList(mailbox_win->form,"list",args,n); 
  n = 0;

  XtAddCallback(mailbox_win->list, XmNsingleSelectionCallback, 
		(XtCallbackProc) mailboxes_select, mailbox_win);

  if(mailbox_win->top_level)
    XtAddCallback(mailbox_win->list, XmNdefaultActionCallback, 
		  (XtCallbackProc) mailboxes_open, mailbox_win);
  else
    XtAddCallback(mailbox_win->list, XmNdefaultActionCallback, 
		  (XtCallbackProc) mailboxes_copy, mailbox_win);


  XtAddCallback(mailbox_win->shell, XmNpopdownCallback, 
		(XtCallbackProc) mailboxes_popdown, mailbox_win);

  XtAddCallback(mailbox_win->shell, XmNdestroyCallback, 
		(XtCallbackProc) mailboxes_destroy, mailbox_win);

  XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);      n ++;
  XtSetArg(args[n], XmNtopWidget,        mailbox_win->mailbox); n ++;
  XtSetArg(args[n], XmNleftAttachment,   XmATTACH_FORM);        n ++;
  XtSetArg(args[n], XmNrightAttachment,  XmATTACH_FORM);        n ++;
  XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);        n ++;

  XtSetValues(XtParent(mailbox_win->list), args, n); 
  n = 0;

  if(mailbox_win->top_level)
    translations = XtParseTranslationTable(GLOBAL_mailboxes_pop_translations);
  else
    translations = XtParseTranslationTable(GLOBAL_mailcopy_pop_translations);
  XtOverrideTranslations(mailbox_win->list,translations);

  XtManageChild(mailbox_win->list);

  XtManageChild(mailbox_win->form);

  stuff_mailbox_list(mailbox_win, FALSE);

  mailboxes_set_title(mailbox_win);
  XtManageChild(mailbox_win->shell);
  XtPopup(mailbox_win->shell, XtGrabNone);
  position_popup_widget(mailbox_win->shell, FALSE);

  XmProcessTraversal(mailbox_win->mailbox, XmTRAVERSE_CURRENT);

  pop_cursor();
  mailbox_win->is_realized = TRUE;
  return(mailbox_win);
}


#ifdef __STDC__
void mailboxes_set_title(Mailbox_Win *mailbox_win) 
#else
void mailboxes_set_title(mailbox_win)
     Mailbox_Win *mailbox_win;
#endif
{
  char buffer[512];
  sprintf(buffer,"%s %s", (mailbox_win->everything)
	  ? MLGetLocalized(XtNstrUnSubscribed,StrUnSubscribed)
	  : MLGetLocalized(XtNstrSubscribed,StrSubscribed),
	  (mailbox_win->type == MAILBOX_TYPE_NEWS)
	  ? MLGetLocalized(XtNstrNewsgroups, StrNewsgroups)
	  : MLGetLocalized(XtNstrMailboxes, StrMailboxes));
  XtVaSetValues(mailbox_win->shell,XtNtitle, buffer, NULL);
  return;
}



#ifdef __STDC__
int set_config_current(Mailbox_Win *mailbox_win, Boolean warn)
#else
int set_config_current(mailbox_win, warn)
     Mailbox_Win *mailbox_win;
     Boolean warn;
#endif
{
  char *conf;
  Server_Config *server;
  char buff[FILEBUFFLEN];

  conf = GetTextField(mailbox_win->server);
  if((*conf == NUL_TERM) || ((server = find_configuration(conf)) == NULL)) {
    if(warn) {
      sprintf(buff,MLGetLocalized(XtNmsgUnknownConfig,MsgUnknownConfig),conf);
      mm_log(buff,WARN);
    }
    create_host_window(session->shell, conf);
    fs_give((void **) &conf);
    return(SYSCALL_FAILURE);
  }
  fs_give((void **) &conf);

  if(server == mailbox_win->current)  /* No change neccessary */
    return(SYSCALL_SUCCESS);

  mailbox_win->current = server;
  XmTextSetString(mailbox_win->server,
		  (server->name) ? server->name : EMPTYSTR);
  mailbox_win->type = ((server->type == SERVICE_NEWS) 
		       || (server->type == SERVICE_NNTP))
    ? MAILBOX_TYPE_NEWS : MAILBOX_TYPE_MAIL ;

  /* Disable copy|move for news and pop3 */

  if((mailbox_win->type == MAILBOX_TYPE_NEWS) || 
     (mailbox_win->current->type == SERVICE_POP)) {
    mailbox_win->button_state |= BTN_MAILBOX_DONEWS;
    mailbox_win->button_state &= ~(BTN_MAILBOX_DOMAIL);
  }
  else {
    mailbox_win->button_state |= BTN_MAILBOX_DOMAIL;
    mailbox_win->button_state &= ~(BTN_MAILBOX_DONEWS);
  }

  mailboxes_check_buttons(mailbox_win);

  if(server->mailbox)
    XmTextSetString(mailbox_win->mailbox,server->mailbox);
  else
    XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
  stuff_mailbox_list(mailbox_win,TRUE);
  return(SYSCALL_SUCCESS);
}

#ifdef __STDC__
void mailboxes_set_configure(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_set_configure(w, mailbox_win, xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  set_config_current(mailbox_win,FALSE);
  XmProcessTraversal(mailbox_win->pattern, XmTRAVERSE_CURRENT);
  return;
}

#ifdef __STDC__
void mailboxes_configure(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_configure(w, mailbox_win, xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  Server_Config *server;
  if((set_config_current(mailbox_win, FALSE)) == SYSCALL_FAILURE)
    return;
  server = mailbox_win->current;
  if(server) {
    if(server->next)
      server = server->next;
    else
      server = session->servers;
  }
  if(server) {
    XmTextSetString(mailbox_win->server,server->name);
    set_config_current(mailbox_win,FALSE);
  }
  return;
}

#ifdef __STDC__
void mailboxes_fetch(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_fetch(w, mailbox_win, xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  char *patt;

  if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
    return;

  patt = XmTextGetString(mailbox_win->pattern);

  load_mailbox_list(mailbox_win, mailbox_win->current, patt,
		    (mailbox_win->everything == TRUE)
		    ? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
  fs_give((void **) &patt);
  stuff_mailbox_list(mailbox_win,FALSE);
  return;
}



#ifdef __STDC__
void mailboxes_toggle_pattern(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_toggle_pattern(w, mailbox_win, xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  if(mailbox_win->everything)
    XmTextSetString(mailbox_win->pattern, MAILBOXALLPATTERN);
  else
    XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);
  return;
}

#ifdef __STDC__
void mailboxes_toggle_mailbox(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_toggle_mailbox(w, mailbox_win, xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  int *sel;
  int total;
  int pos;
  int cnt;

  XtVaGetValues(mailbox_win->list, XmNitemCount, &total, NULL);
  if(total == 0)
    return;

  if(XmListGetSelectedPos(mailbox_win->list, &sel, &cnt))
    pos = sel[0] + 1;
  else
    pos = 1;

  if(cnt)
    XtFree((XtPointer) sel);

  if(pos > total)
    pos = 1;
  XmListDeselectAllItems(mailbox_win->list);
  XmListSelectPos(mailbox_win->list,pos, TRUE);
  return;
}


#ifdef __STDC__
void mailboxes_everything(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_everything(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XmTextSetString(mailbox_win->pattern, MAILBOXALLPATTERN);
  mailbox_win->everything = TRUE;
  mailboxes_set_title(mailbox_win);
  return;
}

#ifdef __STDC__
void mailboxes_subscribed(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_subscribed(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);
  mailbox_win->everything = FALSE;
  mailboxes_set_title(mailbox_win);
  return;
}




#define MOP_SUBSCRIBE   1
#define MOP_UNSUBSCRIBE 2
#define MOP_DESTROY     3
#define MOP_CREATE      4
#define MOP_RENAME      5
#define MOP_CREATE_ONLY 6

#ifdef __STDC__
void mailboxes_manage(Mailbox_Win *mailbox_win, int operation)
#else
void mailboxes_manage(mailbox_win, operation)
     Mailbox_Win *mailbox_win;
     int operation;
#endif
{
  char *conf;
  long openflags = 0L;
  Server_Config *server;
  char *server_str = NULL;
  char *mailbox_str = NULL;
  char *newname = NULL;
  char *tmp = NULL;
  char *patt;
  int error = 0;
  MAILSTREAM *mailstream = NIL;

  if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
    return;

  if(preferences.developer_debug == TRUE)
    openflags = OP_DEBUG;


  mailbox_str = get_mailbox_string_from_window(mailbox_win);
  
  if(mailbox_str == NULL)
    return;
  
  if(*mailbox_str == NUL_TERM) {
    fs_give((void **) &mailbox_str);
    return;
  }
  

  if(operation == MOP_RENAME) {
    tmp = input_string(mailbox_win->shell,
		       MLGetLocalized(XtNmsgNewMailboxName,
				      MsgNewMailboxName),
		       NULL, RENAMEMAILBOXHELPFILE);
  
    if(tmp == NULL) 
      return;
    
    if(*tmp == NUL_TERM) {
      fs_give((void **) &tmp);
      fs_give((void **) &mailbox_str);
      return;
    }

    newname = format_mailboxname_server(mailbox_win->current,
				    tmp, mailbox_win->type);
    fs_give((void **) &tmp);
    if((strcmp(newname, mailbox_str)) == STRMATCH) {
      fs_give((void **) &newname);
      fs_give((void **) &mailbox_str);
      return;
    }
    close_invalid_mailbox(mailbox_str);
  }

  if(mailbox_win->top_level == TRUE)
    push_cursor(WATCH_CURSOR);
  else
    XDefineCursor(display, XtWindow(mailbox_win->shell), clock_cursor);


  if(mailbox_win->current->imap) {
    mailstream = mail_open(NIL,mailbox_win->current->imap,
			   openflags|OP_HALFOPEN);
    if(mailstream == NIL) {
      fs_give((void **) &mailbox_str);
      if(newname)
	fs_give((void **) &newname);
      if(mailbox_win->top_level == TRUE)
	pop_cursor();
      else    
	XUndefineCursor(display, XtWindow(mailbox_win->shell));
      return;
    }
  }

  session->active = mailbox_win->current;

  switch(operation) {

  case MOP_SUBSCRIBE:
    if(! mail_subscribe(mailstream,mailbox_str))
      error = MOP_SUBSCRIBE;
    break;

  case MOP_UNSUBSCRIBE:
    if(! mail_unsubscribe(mailstream,mailbox_str))
      error = MOP_UNSUBSCRIBE;
    if(! error)
      XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
    break;

  case MOP_CREATE:
    if(mailbox_win->type == MAILBOX_TYPE_MAIL)
      if(! mail_create(mailstream,mailbox_str))
	error = MOP_CREATE;
    if(! mail_subscribe(mailstream,mailbox_str))
      error = MOP_SUBSCRIBE;
    break;

  case MOP_CREATE_ONLY:
    if(mailbox_win->type == MAILBOX_TYPE_MAIL)
      if(! mail_create(mailstream,mailbox_str))
	error = MOP_CREATE;
    break;

  case MOP_DESTROY:
    if(! mail_unsubscribe(mailstream,mailbox_str))
      error = MOP_UNSUBSCRIBE;
    if(mailbox_win->type == MAILBOX_TYPE_MAIL)
      if((ml_confirm(mailbox_win->shell,
		     MLGetLocalized(XtNmsgDestroyMailbox,
				    MsgDestroyMailbox),
		     CONFIRM_OK_CANCEL)) == TRUE) {
	close_invalid_mailbox(mailbox_str);
	if(! mail_delete(mailstream,mailbox_str))
	  error = MOP_DESTROY;
      }
    if(! error)
      XmTextSetString(mailbox_win->mailbox, EMPTYSTR);
    break;

  case MOP_RENAME:
    if(mailbox_win->type == MAILBOX_TYPE_MAIL) {
      if(! mail_unsubscribe(mailstream,mailbox_str))
	error = MOP_UNSUBSCRIBE;
      if(! mail_rename(mailstream,mailbox_str,newname))
	error = MOP_RENAME;
      if(! mail_subscribe(mailstream,newname))
	error = MOP_SUBSCRIBE;
    }
    if(!error)
      XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
    break;

  default:
    break;
  }

  if(mailstream != NIL)
    mail_close(mailstream);


  if(error) 
    mm_log(MLGetLocalized(XtNmsgMailboxOpFailed,
			  MsgMailboxOpFailed), WARN);
  else
    mm_log(MLGetLocalized(XtNmsgMailboxOpSuccess,
			  MsgMailboxOpSuccess), NIL);



  if((mailbox_win->everything == FALSE) ||
     ((operation == MOP_CREATE) || operation == MOP_DESTROY) 
     || (operation == MOP_RENAME)) {
    patt = XmTextGetString(mailbox_win->pattern);

    load_mailbox_list(mailbox_win, mailbox_win->current, patt,
		      (mailbox_win->everything == TRUE)
		      ? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
    fs_give((void **) &patt);
    stuff_mailbox_list(mailbox_win,FALSE);
  }

  if(mailbox_win->top_level == TRUE)
    pop_cursor();
  else    
    XUndefineCursor(display, XtWindow(mailbox_win->shell));



  return;
}



#ifdef __STDC__
void mailboxes_create(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_create(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_CREATE);
  return;
}
 

#ifdef __STDC__
void mailboxes_create_only(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_create_only(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_CREATE_ONLY);
  return;
}

#ifdef __STDC__
void mailboxes_subscribe_only(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_subscribe_only(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_SUBSCRIBE);
  return;
}


#ifdef __STDC__
void mailboxes_delete(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_delete(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_DESTROY);
  return;
}


#ifdef __STDC__
void mailboxes_unsubscribe_only(Widget w, Mailbox_Win *mailbox_win, 
				XtPointer xp)
#else
void mailboxes_unsubscribe_only(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_UNSUBSCRIBE);
  return;
}



#ifdef __STDC__
void mailboxes_rename(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_rename(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailboxes_manage(mailbox_win, MOP_RENAME);
  return;
}


#ifdef __STDC__
void mailboxes_pattern(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_pattern(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{

}

#ifdef __STDC__
void mailboxes_select(Widget w, Mailbox_Win *mailbox_win, 
		   XmListCallbackStruct *xp)
#else
void mailboxes_select(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XmListCallbackStruct *xp;
#endif
{
  char *str;

  XmStringGetLtoR(xp->item, XmSTRING_DEFAULT_CHARSET, &str);
  XmTextSetString(mailbox_win->mailbox,str);
  fs_give((void **) &str);

  /* In case they turned it off, keep it enabled. */
  XmListSelectPos(mailbox_win->list,xp->item_position,FALSE);
  mailbox_win->item_no = (unsigned long) xp->item_position;
  mailbox_win->button_state &= ~(BTN_NOSELECTION);
  mailboxes_check_buttons(mailbox_win);
  return;
}

#ifdef __STDC__
void mailboxes_open(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_open(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  Mailbox *mailbox;
  char *mailboxname;
  char *fixedname;


  if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
    return;

  push_cursor(WATCH_CURSOR);

  mailbox = new_mailbox();
  mailbox->has_new_mail = FALSE;
  mailbox->auto_scan = FALSE;
  mailbox->server = mailbox_win->current;
  mailboxname = GetTextField(mailbox_win->mailbox);
  fixedname = fix_mailboxpath(mailboxname);

  mailbox->host = cpystr((mailbox_win->current->hostname) 
			 ? mailbox_win->current->hostname : EMPTYSTR);
  mailbox->mailboxname = cpystr(fixedname);
  mailbox->type = mailbox_win->type;

  if(*fixedname != NUL_TERM)
    mailbox->imapname = format_mailboxname_server(mailbox_win->current,
					    fixedname, mailbox_win->type);

  fs_give((void **) &mailboxname);
  fs_give((void **) &fixedname);

  mailboxes_close_window(w,mailbox_win,xp);

  session->active = mailbox_win->current;
  if((mailbox->imapname != NULL) && (*mailbox->imapname != NUL_TERM))
    open_mailbox(mailbox_win->mwin, mailbox, FALSE);
  else {
    mwin_cancel(mailbox_win->mwin);
    free_mailbox(mailbox);
  }
  session->active = NULL;
  pop_cursor();
  return;
}

#ifdef __STDC__
void mailboxes_scan(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_scan(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  char *mailboxname;
  char *fixedname;
  int current_count;
  Mailbox *mailbox;

  if(mailbox_win->item_no == 0L) {
    mm_log(MLGetLocalized(XtNmsgNoMailboxSelected,
			  MsgNoMailboxSelected), WARN);
    return;
  }

  if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
    return;

  push_cursor(WATCH_CURSOR);

  mailbox = new_mailbox();

  close_autoscan_mailbox();

  mailbox->has_new_mail = FALSE;
  mailbox->auto_scan = TRUE;
  mailbox->server = mailbox_win->current;

  mailboxname = GetTextField(mailbox_win->mailbox);
  fixedname = fix_mailboxpath(mailboxname);

  mailbox->host = cpystr((mailbox_win->current->hostname)
			 ? (mailbox_win->current->hostname) : EMPTYSTR);
  mailbox->mailboxname = cpystr(fixedname);
  mailbox->type = mailbox_win->type;

  if(*fixedname != NUL_TERM)
    mailbox->imapname = format_mailboxname_server(mailbox_win->current,
					   fixedname, mailbox_win->type);

  fs_give((void **) &mailboxname);
  fs_give((void **) &fixedname);

  session->active = mailbox_win->current;
  if((mailbox->imapname != NULL) && (*mailbox->imapname != NUL_TERM)) {
    if(mailbox_win->mwin->destroyed == TRUE)
      mailbox_win->mwin = create_main_window(NULL);
    open_mailbox(mailbox_win->mwin,mailbox, FALSE);
  }
  else {
    free_mailbox(mailbox);
    mwin_cancel(mailbox_win->mwin);
  }
  session->active = NULL;

  XmListDeselectAllItems(mailbox_win->list);
  XtVaGetValues(mailbox_win->list, XmNitemCount, &current_count, NULL);
  if(mailbox_win->item_no < current_count) 
    XmListSelectPos(mailbox_win->list,mailbox_win->item_no + 1, TRUE);
  else {
    mailbox_win->item_no = 0L;
    mailbox_win->button_state |= BTN_NOSELECTION;
    mailboxes_check_buttons(mailbox_win);
  }
  pop_cursor();
  return;
}

#ifdef __STDC__
void mailboxes_dismiss(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_dismiss(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XUndefineCursor(display, XtWindow(mailbox_win->shell));
  XtPopdown(mailbox_win->shell);
  mailbox_win->is_realized = FALSE;
  mwin_cancel(mailbox_win->mwin);
  return;
}




#ifdef __STDC__
void mailboxes_cancel(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_cancel(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
  mailbox_win->done = 1;
  return;
}





#ifdef __STDC__
void mailboxes_close_window(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_close_window(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XUndefineCursor(display, XtWindow(mailbox_win->shell));
  XtPopdown(mailbox_win->shell);
  mailbox_win->is_realized = FALSE;
  return;
}




#ifdef __STDC__
void mailboxes_popdown(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_popdown(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  XUndefineCursor(display, XtWindow(mailbox_win->shell));
  mailbox_win->is_realized = FALSE;
  return;
}



#ifdef __STDC__
void mailboxes_destroy(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_destroy(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  Boolean toplevel;
  if(mailbox_win) {
    toplevel = mailbox_win->top_level;
    free_buttonlist(mailbox_win->buttonlist);
    fs_give((void **) &mailbox_win);
    if(toplevel == TRUE)
      session->mailboxwin = NULL;
    else
      session->mailcopywin = NULL;
  }
  return;
}


#ifdef __STDC__
void mailboxes_help(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_help(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  help(mailbox_win->shell,MAILBOXESHELPFILE);
  return;
}



#ifdef __STDC__
void close_invalid_mailbox(char *str)
#else
void close_invalid_mailbox(str)
     char *str;
#endif
{
  Mailbox *mailbox;

  for(mailbox = session->mailboxes; mailbox; mailbox = mailbox->next)
    if(strcmp(str,mailbox->imapname) == STRMATCH) {
      close_mailbox(mailbox);
      break;
    }
  return;
}


#ifdef __STDC__
void close_autoscan_mailbox(void)
#else
void close_autoscan_mailbox()
#endif
{
  Mailbox *mailbox;
  Boolean found;
  do {
    found = FALSE;
    for(mailbox = session->mailboxes; mailbox; mailbox = mailbox->next) {
      if(mailbox->auto_scan == TRUE) {
	found = TRUE;
	close_mailbox(mailbox);
	break;
      }
    }
  } while(found == TRUE);
  return;
}



#ifdef __STDC__
void mblist_help(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mblist_help(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  help(mailbox_win->shell,MAILBOXESHELPFILE);
  return;
}



#ifdef __STDC__
void mblist_select(Widget w, Mailbox_Win *mailbox_win, 
		   XmListCallbackStruct *xp)
#else
void mblist_select(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XmListCallbackStruct *xp;
#endif
{
  char *str;

  XmStringGetLtoR(xp->item, XmSTRING_DEFAULT_CHARSET, &str);
  XmTextSetString(mailbox_win->mailbox,str);
  fs_give((void **) &str);
  return;
}


#ifdef __STDC__
void mailboxes_copy(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_copy(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailbox_win->move = FALSE;
  mailbox_win->done = TRUE;
  return;
}


#ifdef __STDC__
void mailboxes_move(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_move(w,mailbox_win,xp)
     Widget w;
     Mailbox_Win *mailbox_win;
     XtPointer xp;
#endif
{
  mailbox_win->move = TRUE;
  mailbox_win->done = TRUE;
  return;
}


#ifdef __STDC__
char *fix_netmailboxpath(char * str, Boolean *changed)
#else
char *fix_netmailboxpath(str, changed)
     char *str;
     Boolean *changed;
#endif
{
  char *ptr;
  char buff[FILEBUFFLEN];
  Server_Config *config;
  char *tmp = NULL;

  *changed = FALSE;

  if(str == NULL)
    return(NULL);

  if(*str == NUL_TERM)
    return(cpystr(str));

  strcpy(buff,str);

  if((ptr = strchr(buff,COLONCHAR)) == NULL) 
    return(fix_mailboxpath(buff));


  *ptr = NUL_TERM;
  ptr ++;
  
  config = find_configuration(buff);
  if(config == NULL)
     return(fix_mailboxpath(buff));
  
  if((config == NULL) || 
     ((config->type != SERVICE_LOCAL) && (config->type != SERVICE_IMAP))) {
       mm_log(MLGetLocalized(XtNmsgUnsupportedConfig,
			     MsgUnsupportedConfig), WARN);
       return(NULL);
     }
  
  *changed = TRUE;
  session->active = config;
  tmp = fix_mailboxpath(ptr);
  strcpy(buff,(config->imap) ? config->imap : EMPTYSTR);
  strcat(buff,(tmp) ? tmp : EMPTYSTR);
  if(tmp)
    fs_give((void **) &tmp);

  return(cpystr(buff));
}

#ifdef __STDC__
char *fix_mailboxpath(char *str)
#else
char *fix_mailboxpath(str)
     char * str;
#endif
{
  char *ret = NULL;
  char *ptr = NULL;

  if(str == NULL || *str == NUL_TERM)
    return(cpystr(EMPTYSTR));

  if((strcasecmp(str,INBOX)) == 0)
    ucase(str);

  if(*str == '{' && ((ptr = strchr(str,'}')) != NULL))
    ptr ++;
  else
    ptr = str;

  if(*ptr != PLUSCHAR)
    return(cpystr(ptr));

  ptr ++;
  if(*ptr == PLUSCHAR)
    return(cpystr(ptr));

  if((preferences.folder_path == NULL) 
     || (*preferences.folder_path == NUL_TERM))
    return(cpystr(ptr));

  ret = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);

  strcpy(ret,preferences.folder_path);

  if(ret[strlen(ret) - 1] != PATH_SEPARATOR_CHAR)
    strcat(ret,PATH_SEPARATOR_STR);
  strcat(ret,ptr);
  return(ret);
}

#ifdef __STDC__
char *unfix_mailboxpath(char *str)
#else
char *unfix_mailboxpath(str)
     char *str;
#endif
{
  char *buf = NULL;
  char *ret = NULL;
  char *ptr = NULL;

  if((str == NULL) || (*str == NUL_TERM))
    return(cpystr(EMPTYSTR));

  if(*str == '{' && ((ptr = strchr(str,'}')) != NULL))
    ptr ++;
  else
    ptr = str;

  if((preferences.folder_path == NULL) 
     || (*preferences.folder_path == NUL_TERM))
    return(cpystr(ptr));

  buf = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);
  ret = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);

  strcpy(buf,preferences.folder_path);

  if(buf[strlen(buf) - 1] != PATH_SEPARATOR_CHAR)
    strcat(buf,PATH_SEPARATOR_STR);

  if(strncmp(ptr,buf,strlen(buf)) == STRMATCH) {
    strcpy(ret,PLUSSTR);
    strcat(ret,ptr + strlen(buf));
    fs_give((void **) &buf);
  }
  else {
    fs_give((void **) &buf);
    strcpy(ret,ptr);
  }
  return(ret);
}


#ifdef __STDC__
void load_mailbox_list(Mailbox_Win *mailbox_win, Server_Config *server, 
		       char *patt, int loadflags)
#else
void load_mailbox_list(mailbox_win, server,patt,loadflags)
     Mailbox_Win *mailbox_win;
     Server_Config *server;
     char *patt;
     int loadflags;
#endif
{
  MAILSTREAM *mailstream = NULL;
  long openflags = 0L;
  char *tmp = NULL;
  char newpatt[FILEBUFFLEN];

  if(preferences.developer_debug == TRUE)
    openflags = OP_DEBUG;

  if((loadflags == LOAD_UNSUBSCRIBED)
     && (((strcmp(patt,MAILBOXNONOPATTERN)) == STRMATCH)
     || ((strcmp(patt,MAILBOXDEFAULTPATTERN)) == STRMATCH))
     && ((ml_confirm(session->shell,
		     MLGetLocalized(XtNmsgEntireUniverse,
				    MsgEntireUniverse),
		     CONFIRM_OK_CANCEL))== FALSE))
      return;


  if(mailbox_win && mailbox_win->top_level == FALSE)
    XDefineCursor(display, XtWindow(mailbox_win->shell), clock_cursor);
  else
    push_cursor(WATCH_CURSOR);

  tmp = fix_mailboxpath(patt);
  session->active = server;

  if(server->imap) {
    mailstream = mail_open(NIL,server->imap,openflags|OP_HALFOPEN);
    if(mailstream == NIL) {
      pop_cursor();
      session->active = NULL;
      return;
    }
  }
  sprintf(newpatt,"%s%s",(server->imap) ? server->imap : EMPTYSTR, tmp);
  fs_give((void **) &tmp);

  switch(loadflags) {
  case LOAD_SUBSCRIBED:
    free_mailbox_list(server->subscribed);
    server->subscribed = NULL;
    server->in_use = TRUE;
    mail_lsub(mailstream,NIL,newpatt);
    server->in_use = FALSE;
    if(server->subscribed)
      sort_mailbox_list(&server->subscribed);
    break;
    
  case LOAD_UNSUBSCRIBED:
    free_mailbox_list(server->unsubscribed);
    server->unsubscribed = NULL;
    server->in_use = TRUE;
    if(mailstream)
      mail_parameters(mailstream,SET_IMAP2FINDALL,(void *) 1);
    mail_list(mailstream,NIL,newpatt);
    if(mailstream)
      mail_parameters(mailstream,SET_IMAP2FINDALL,(void *) 0);
    server->in_use = FALSE;
    if(server->unsubscribed)
      sort_mailbox_list(&server->unsubscribed);
    break;
  default:
    break;
  }

  if(mailstream)
    mail_close(mailstream);
  session->active = NULL;

  if(mailbox_win && mailbox_win->top_level == FALSE)
    XUndefineCursor(display, XtWindow(mailbox_win->shell));
  else
    pop_cursor();

  return;
}


#ifdef __STDC__
void stuff_mailbox_list(Mailbox_Win *mailbox_win, Boolean force)
#else
void stuff_mailbox_list(mailbox_win,force)
     Mailbox_Win *mailbox_win;
     Boolean force;
#endif
{
  Mailbox_List *mailbox_list;
  Mailbox_List *ptr;
  char *fixedname;
  XmString xstr;

  XmListDeselectAllItems(mailbox_win->list);
  mailbox_win->item_no = 0L;
  mailbox_win->button_state |= BTN_NOSELECTION;
  

  if(mailbox_win->is_realized == TRUE)
    mailboxes_check_buttons(mailbox_win);
  
  XmListDeleteAllItems(mailbox_win->list);
  
  if(mailbox_win->current) {
    if(mailbox_win->everything == TRUE)
      mailbox_list = mailbox_win->current->unsubscribed;
    else
      mailbox_list = mailbox_win->current->subscribed;
  }

  for(ptr = mailbox_list; ptr; ptr = ptr->prev) {
    fixedname = unfix_mailboxpath(ptr->name);
    xstr = XmStringCreateSimple(fixedname);
    fs_give((void **) &fixedname);
    XmListAddItemUnselected(mailbox_win->list,xstr,0);
    XmStringFree(xstr);
  }

  return;
}

#ifdef __STDC__
int mailbox_compare(const void *n1, const void *n2)
#else
int mailbox_compare(n1,n2)
     const void *n1;
     const void *n2;
#endif
{
  Mailbox_List **name1 = (Mailbox_List **) n1;
  Mailbox_List **name2 = (Mailbox_List **) n2;

  char *fixedname1;
  char *fixedname2;
  int result;

  fixedname1 = unfix_mailboxpath((*(name1))->name);
  fixedname2 = unfix_mailboxpath((*(name2))->name);

  result = strcmp(fixedname1, fixedname2);

  /* ensure INBOX is first in the list */
  
  if(strcasecmp(fixedname1,INBOX) == STRMATCH)
    result = (-1);

  if(strcasecmp(fixedname2,INBOX) == STRMATCH)
    result = 1;

  fs_give((void **) &fixedname1);
  fs_give((void **) &fixedname2);

  return(result);
}

#ifdef __STDC__
void sort_mailbox_list(Mailbox_List **list)
#else
void sort_mailbox_list(list)
     Mailbox_List **list;
#endif
{
  Mailbox_List **sort;
  Mailbox_List *mailbox_list;
  int n = 0;
  int total = 0;

  for(mailbox_list = *list ; mailbox_list; mailbox_list = mailbox_list->prev)
    total ++;

  if(total < 2)
    return;

  sort = (Mailbox_List **) fs_get(total * sizeof(Mailbox_List *));
  
  for(mailbox_list = *list; mailbox_list; mailbox_list = mailbox_list->prev) {
    sort[n] = mailbox_list;
    n ++;
  }

  qsort((char *) sort, total, sizeof(Mailbox_List **), mailbox_compare);

  for(n = 0; n < total; n ++) {
    mailbox_list = sort[n];
    if(n == 0)
      *list = mailbox_list;
    if(n < (total - 1))
      mailbox_list->prev = sort[n + 1];
    else
      mailbox_list->prev = NULL;
  }
  
  fs_give((void **) &sort);
  return;
}



#ifdef __STDC__
char *format_mailbox_name(char *server,char *mailbox,int type)
#else
char *format_mailbox_name(server,mailbox,type)
     char *server;
     char *mailbox;
     int type;
#endif
{
  Server_Config *server_config;
  char buff[FILEBUFFLEN];
  char *ret;
  char *tmp;

  *buff = NUL_TERM;

  tmp = fix_mailboxpath(mailbox);

  if(tmp) {
    server_config = find_server_by_host(server);
    if(server_config) {
      strcpy(buff,  (server_config->imap) ? server_config->imap : EMPTYSTR);
      if(type == MAILBOX_TYPE_NEWS)
	strcat(buff,NEWSNAMESTART);
      strcat(buff,tmp);
    }
    fs_give((void **) &tmp);
  }
     
  ret = cpystr(buff);
  return(ret);
}


#ifdef __STDC__
char *format_mailboxname_server(Server_Config *server,char *mailbox,int type)
#else
char *format_mailboxname_server(server,mailbox,type)
     Server_Config *server;
     char *mailbox;
     int type;
#endif
{
  char buff[FILEBUFFLEN];
  char *ret;
  char *tmp;

  *buff = NUL_TERM;

  tmp = fix_mailboxpath(mailbox);

  if(tmp) {
    if(server) {
      strcpy(buff,  (server->imap) ? server->imap : EMPTYSTR);
      if(type == MAILBOX_TYPE_NEWS)
	strcat(buff,NEWSNAMESTART);
      strcat(buff,tmp);
    }
    fs_give((void **) &tmp);
  }
     
  ret = cpystr(buff);
  return(ret);
}




#ifdef __STDC__
char *get_mailbox_string_from_window(Mailbox_Win *mailbox_win)
#else
char *get_mailbox_string_from_window(mailbox_win)
     Mailbox_Win *mailbox_win;
#endif
{
  char *mailbox;
  char *ret = NULL;

  if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
    return(NULL);

  mailbox = GetTextField(mailbox_win->mailbox);
  if(*mailbox != NUL_TERM) {
    ret = format_mailboxname_server(mailbox_win->current, mailbox,
			      mailbox_win->type);
    fs_give((void **) &mailbox);
  }
  else
    fs_give((void **) &mailbox);
  return(ret);
}



#ifdef __STDC__
char *get_mailbox_simple_from_window(Mailbox_Win *mailbox_win)
#else
char *get_mailbox_simple_from_window(mailbox_win)
     Mailbox_Win *mailbox_win;
#endif
{
  char *mailbox;
  char *ret = NULL;

  mailbox = GetTextField(mailbox_win->mailbox);
  ret = fix_mailboxpath(mailbox);
  fs_give((void **) &mailbox);
  return(ret);
}


#ifdef __STDC__
void mailboxes_pop(Widget w, XtPointer xp)
#else
void mailboxes_pop(w,xp)
     Widget w;
     XtPointer xp;
#endif
{
  if((session->mailboxwin != NULL) 
     && (session->mailboxwin->is_realized == TRUE))
    mailboxes_dismiss(w,session->mailboxwin,NULL);
  return;
}

#ifdef __STDC__
void mailcopy_pop(Widget w, XtPointer xp)
#else
void mailcopy_pop(w,xp)
     Widget w;
     XtPointer xp;
#endif
{
  if((session->mailcopywin != NULL)
     && (session->mailcopywin->is_realized == TRUE))
    mailboxes_cancel(w,session->mailcopywin,NULL);
  return;
}



syntax highlighted by Code2HTML, v. 0.9.1