<?php
function formatMail( $mail )
{
	$t = '';
	$t .= "From:      ". formatAddress( $mail->from ). "\n";
	$t .= "To:        ". formatAddresses( $mail->to ). "\n";
	$t .= "Cc:        ". formatAddresses( $mail->cc ). "\n";
	$t .= "Bcc:       ". formatAddresses( $mail->bcc ). "\n";
	$t .= 'Date:      '. date( DATE_RFC822, $mail->timestamp ). "\n";
	$t .= 'Subject:   '. $mail->subject . "\n";
	$t .= "MessageId: ". $mail->messageID . "\n";
	$t .= "\n";
	$t .= formatMailPart( $mail->body );
	return $t;
}

function formatMailPart( $part )
{
	if ( $part instanceof ezcMail )
		return formatMail( $part );

	if ( $part instanceof ezcMailText )
		return formatMailText( $part );

	if ( $part instanceof ezcMailFile )
		return formatMailFile( $part );

	if ( $part instanceof ezcMailRfc822Digest )
		return formatMailRfc822Digest( $part );

	if ( $part instanceof ezcMailMultiPart )
		return formatMailMultipart( $part );

	die( "No clue about the ". get_class( $part ) . "\n" );
}

function formatMailMultipart( $part )
{
	if ( $part instanceof ezcMailMultiPartAlternative )
		return formatMailMultipartAlternative( $part );

	if ( $part instanceof ezcMailMultiPartDigest )
		return formatMailMultipartDigest( $part );

	if ( $part instanceof ezcMailMultiPartRelated )
		return formatMailMultipartRelated( $part );

	if ( $part instanceof ezcMailMultiPartMixed )
		return formatMailMultipartMixed( $part );

	die( "No clue about the ". get_class( $part ) . "\n" );
}

function formatMailMultipartMixed( $part )
{
	$t = '';
	foreach ( $part->getParts() as $key => $alternativePart )
	{
		$t .= "-MIXED-$key------------------------------------------------------------------\n";
		$t .= formatMailPart( $alternativePart );
	}
	$t .= "-MIXED END----------------------------------------------------------\n";
	return $t;
}

function formatMailMultipartRelated( $part )
{
	$t = '';
	$t .= "-RELATED MAIN PART--------------------------------------------------------\n";
	$t .= formatMailPart( $part->getMainPart() );
	foreach ( $part->getRelatedParts() as $key => $alternativePart )
	{
		$t .= "-RELATED PART $key-----------------------------------------------------\n";
		$t .= formatMailPart( $alternativePart );
	}
	$t .= "-RELATED END--------------------------------------------------------\n";
	return $t;
}

function formatMailMultipartDigest( $part )
{
	$t = '';
	foreach ( $part->getParts() as $key => $alternativePart )
	{
		$t .= "-DIGEST-$key-----------------------------------------------------------------\n";
		$t .= formatMailPart( $alternativePart );
	}
	$t .= "-DIGEST END---------------------------------------------------------\n";
	return $t;
}

function formatMailRfc822Digest( $part )
{
	$t = '';
	$t .= "-DIGEST-ITEM-$key------------------------------------------------------------\n";
	$t .= "Item:\n\n";
	$t .= formatMailpart( $part->mail );
	$t .= "-DIGEST ITEM END----------------------------------------------------\n";
	return $t;
}

function formatMailMultipartAlternative( $part )
{
	$t = '';
	foreach ( $part->getParts() as $key => $alternativePart )
	{
		$t .= "-ALTERNATIVE ITEM $key-------------------------------------------------------\n";
		$t .= formatMailPart( $alternativePart );
	}
	$t .= "-ALTERNATIVE END----------------------------------------------------\n";
	return $t;
}

function formatMailText( $part )
{
	$t = '';
	$t .= "Original Charset: {$part->originalCharset}\n";
	$t .= "Charset:          {$part->charset}\n";
	$t .= "Encoding:         {$part->encoding}\n";
	$t .= "Type:             {$part->subType}\n";
	$t .= "\n{$part->text}\n";
	return $t;
}

function formatMailFile( $part )
{
	$t = '';
	$t .= "Disposition Type: {$part->dispositionType}\n";
	$t .= "Content Type:     {$part->contentType}\n";
	$t .= "Mime Type:        {$part->mimeType}\n";
	$t .= "Content ID:       {$part->contentId}\n";
	$t .= "Filename:         {$part->fileName}\n";
	$t .= "\n";
	return $t;
}

function formatAddresses( $addresses )
{
	$fa = array();
	foreach( $addresses as $address )
	{
		$fa[] = formatAddress( $address );
	}
	return implode( ', ', $fa );
}

function formatAddress( $address )
{
	$name = '';
	if ( !empty( $address->name ) )
	{
		$name = "{$address->name} ";
	}
	return $name . "<{$address->email}>";	
}
