/*
 *
 *  AM --- AmigaMail
 *  (C) 1991, 1992 by Christian Riede
 *
 *  AM is distributed in the hope that it will be useful, but WITHOUT ANY
 *  WARRANTY.  No author or distributor accepts responsibility to anyone
 *  for the consequences of using it or for whether it serves any
 *  particular purpose or works at all, unless he says so in writing.
 *  Refer to the GNU General Public License, Version 1, for full details.
 *  
 *  Everyone is granted permission to copy, modify and redistribute AM,
 *  but only under the conditions described in the GNU General Public
 *  License, Version 1.  A copy of this license is supposed to have been 
 *  given to you along with AM so you can know your rights and responsi-
 *  bilities.  It should be in a file named COPYING.  Among other things,
 *  the copyright notice and this notice must be preserved on all copies.
 *
 *  
 *
 */

#include "am.h"

/* build list for use with listview-gadget */


void SelectAll(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
	struct Mail *Mail;

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		Sort(Selected,Mail);
}

void SelectNew(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
	struct Mail *Mail;

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if ((Mail->read & MAIL_NEW)) 
			Sort(Selected,Mail);
}

void SelectFromMe(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
	struct Mail *Mail;

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if (Mail->read & MAIL_ARCHIVE)
			Sort(Selected,Mail);
}

void SelectToMe(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
	struct Mail *Mail;

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if (!(Mail->read & MAIL_ARCHIVE)) 
			Sort(Selected,Mail);
}

void SelectLastWeek(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{

	struct Mail *Mail;
	time_t now;

	time(&now);

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if (now - Mail->Date < 7*24*60*60) /* seconds of on week */ 
			Sort(Selected,Mail);

}

void SelectSearchTextH(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
    regexp *pat;
	struct Mail *Mail;

	if (!(pat = regcomp((char *)extra)))
		return;

	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if (SearchTextH(pat,Mail))
			Sort(Selected,Mail);

	free(pat);
}

void SelectSearchText(struct List *Mailbox, struct List *Selected,
	void (*Sort)(struct List *,struct Mail *),void *extra)
{
    regexp *pat;
	struct Mail *Mail;

	if (!(pat = regcomp((char *)extra)))
		return;
	
	for (Mail=(struct Mail *)Mailbox->lh_Head;
		Mail->m_Node.ln_Succ;
		Mail=(struct Mail *)Mail->m_Node.ln_Succ)
		if (SearchText(pat,Mail))
			Sort(Selected,Mail);

	free(pat);
}



void DeselectAll(struct List *Selected)
{
	while (RemHead(Selected));
}
